Member 11860540 Ответов: 0

Как установить translatetransform для выбранного цвета в элементе управления custom color picker


Привет,

У меня есть пользовательский элемент управления выбора цвета, я могу изменить цвет выбранного объекта.

Но после закрытия элемента управления и запуска положение выбранного элемента управления в ColorPicker не сохраняется.

он устанавливается только в положение по умолчанию.

Есть ли какой-нибудь способ установить положение элемента управления CustomColorPicker на основе цвета?

вот код пользовательского элемента управления выбора цвета.

Что я уже пробовал:

public partial class ColorPickerControl : UserControl
    {
        #region Properties

        private byte[] _pixels;

        public event CurrentColorChanged SelectedColorChanged;

        public Color CurrentColor = Colors.Purple;

        public SolidColorBrush SelectedCurrentColor
        {
            get { return (SolidColorBrush)GetValue(SelectedCurrentColorProperty); }
            set { SetValue(SelectedCurrentColorProperty, value); }
        }

        public static DependencyProperty SelectedCurrentColorProperty = DependencyProperty.Register("SelectedCurrentColor", typeof(SolidColorBrush), typeof(ColorPickerControl), new PropertyMetadata(Brushes.White));

        #endregion Properties

        public ColorPickerControl()
        {
            DataContext = this;
            InitializeComponent();
            brightnessSlider.ValueChanged += BrightnessSliderValueChanged;
            _markerTransform.X = 99;
            _markerTransform.Y = -20;
            colorMarker.RenderTransform = _markerTransform;
            colorMarker.RenderTransformOrigin = new Point(1, 1);
            brightnessSlider.Value = 0.5;
        }

        #region Color Picker Members

        public readonly TranslateTransform _markerTransform = new TranslateTransform();

        private void Image_MouseDown(object sender, MouseButtonEventArgs e)
        {
            GetSelectedColor(e);
        }

        private void Image_PreviewTouchDown(object sender, TouchEventArgs e)
        {
            GetSelectedColor(e);
        }

        private void Image_PreviewStylusDown(object sender, StylusDownEventArgs e)
        {
            GetSelectedColor(e);
        }

        private void GetSelectedColor(RoutedEventArgs sender)
        {
            try
            {
                var cb = new CroppedBitmap((BitmapSource)(((Image)sender.Source).Source), new Int32Rect((int)Mouse.GetPosition(sender.Source as Image).X, (int)Mouse.GetPosition(sender.Source as Image).Y, 1, 1));
                _pixels = new byte[4];
                try
                {
                    cb.CopyPixels(_pixels, 4, 0);
                    UpdateCurrentColor();
                    SelectedColorChanged(sender, new RoutedEventArgs());
                    UpdateMarkerPosition();
                }
                catch
                {
                }
            }
            catch (Exception)
            {
            }
        }

        private void UpdateCurrentColor()
        {
            CurrentColor = Color.FromRgb(_pixels[2], _pixels[1], _pixels[0]);
            brightnessSlider.Value = 0.5;
            SelectedCurrentColor = new SolidColorBrush(CurrentColor);
        }

        private void UpdateMarkerPosition()
        {
            _markerTransform.X = Mouse.GetPosition(borderColorChart).X - (borderColorChart.ActualWidth / 2);
            _markerTransform.Y = Mouse.GetPosition(borderColorChart).Y - (borderColorChart.ActualHeight / 2);
        }

        private void BrightnessSliderValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            if (_pixels == null)
            {
                _pixels = new byte[3];
                _pixels[2] = CurrentColor.R;
                _pixels[1] = CurrentColor.G;
                _pixels[0] = CurrentColor.B;
            }

            var nc = Color.FromRgb(_pixels[2], _pixels[1], _pixels[0]);
            var f = (float)e.NewValue;
            float r, g, b;
            const float a = 1;

            if (f >= 0.5f)
            {
                r = nc.ScR + (1 - nc.ScR) * (f - 0.5f) * 2;
                g = nc.ScG + (1 - nc.ScG) * (f - 0.5f) * 2;
                b = nc.ScB + (1 - nc.ScB) * (f - 0.5f) * 2;
            }
            else
            {
                r = nc.ScR * f * 2;
                g = nc.ScG * f * 2;
                b = nc.ScB * f * 2;
            }

            CurrentColor = Color.FromScRgb(a, r, g, b);
            SelectedCurrentColor = new SolidColorBrush(CurrentColor);
            if (brightnessSlider.IsLoaded)
                SelectedColorChanged(sender, e);
        }

        private void Image_MouseMove(object sender, MouseEventArgs e)
        {
            if (Mouse.LeftButton == MouseButtonState.Pressed)
            {
                if (e.Source.GetType().Equals(typeof(Image)))
                {
                    var cb = new CroppedBitmap((BitmapSource)(((Image)e.Source).Source), new Int32Rect((int)Mouse.GetPosition(e.Source as Image).X, (int)Mouse.GetPosition(e.Source as Image).Y, 1, 1));
                    _pixels = new byte[4];
                    try
                    {
                        cb.CopyPixels(_pixels, 4, 0);
                        UpdateMarkerPosition();
                        UpdateCurrentColor();
                        SelectedColorChanged(sender, e);
                        Mouse.Synchronize();
                    }
                    catch
                    {
                    }
                }
            }
        }

        #endregion Color Picker Members

        private void Image_PreviewStylusMove(object sender, StylusEventArgs e)
        {
            if (Stylus.GetIsPressAndHoldEnabled(sender as Image))
            {
                if (e.Source.GetType().Equals(typeof(Image)))
                {
                    var cb = new CroppedBitmap((BitmapSource)(((Image)e.Source).Source), new Int32Rect((int)e.GetPosition(e.Source as Image).X, (int)e.GetPosition(e.Source as Image).Y, 1, 1));
                    _pixels = new byte[4];
                    try
                    {
                        cb.CopyPixels(_pixels, 4, 0);
                        UpdateMarkerPosition();
                        UpdateCurrentColor();
                        SelectedColorChanged(sender, e);
                    }
                    catch
                    {
                    }
                }
            }
        }

        private void Image_PreviewTouchMove(object sender, TouchEventArgs e)
        {
            if (e.Source.GetType().Equals(typeof(Image)))
            {
                var cb = new CroppedBitmap((BitmapSource)(((Image)e.Source).Source), new Int32Rect((int)e.GetTouchPoint(e.Source as Image).Position.X, (int)e.GetTouchPoint(e.Source as Image).Position.Y, 1, 1));
                _pixels = new byte[4];
                try
                {
                    cb.CopyPixels(_pixels, 4, 0);
                    UpdateMarkerPosition();
                    UpdateCurrentColor();
                    SelectedColorChanged(sender, e);
                }
                catch
                {
                }
            }
        }

        private void Image_PreviewTouchUp(object sender, TouchEventArgs e)
        {
            GetSelectedColor(e);
        }

        private void Image_PreviewStylusUp(object sender, StylusEventArgs e)
        {
            GetSelectedColor(e);
        }

        private void Image_PreviewMouseUp(object sender, MouseButtonEventArgs e)
        {
            GetSelectedColor(e);
        }
    }

Gerry Schmitz

Если средство выбора не находится на холсте, абсолютного позиционирования не существует; его можно расположить только относительно других элементов управления.

0 Ответов