2

我有一个非常原始的颜色选择器工具(在 WPF 中)。这是它的外观:

在此处输入图像描述

如您所见,您可以在这些非常难看的滑块上通过 HSV 或 RGB 设置颜色 :) 并且Rectangle更新了 Fill 属性。

由于未讨论的原因,此 ColorPicker 是一个 UserControl。

它有大量的 DependencyProperties(主要用于颜色操作):Hue、Sat、Value、R、G、B;以及这些值的混合颜色:RGBColor 和 HSVColor。

这是罪魁祸首RGBColor:

public Color RGBColor
    {
        get { return (Color)GetValue(RGBColorProperty); }
        set { SetValue(RGBColorProperty, value); }
    }

    // Using a DependencyProperty as the backing store for RGBColor.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty RGBColorProperty =
        DependencyProperty.Register("RGBColor", typeof(Color), typeof(SimpleColorPicker), new UIPropertyMetadata(Colors.Transparent, (d, e) =>
        {
            var colorpicker = d as SimpleColorPicker;
            if (e.NewValue != null && colorpicker != null)
            {
                
                var c = (Color)e.NewValue;

                if (c.R != colorpicker.R) colorpicker.R = c.R;
                if (c.G != colorpicker.G) colorpicker.G = c.G;
                if (c.B != colorpicker.B) colorpicker.B = c.B;

                colorpicker.RGBBrush = new SolidColorBrush(colorpicker.RGBColor);

                if (colorpicker._fromRGB)
                {
                    var hsv = HSVColor.FromColor(c);
                    if (colorpicker.HSVColor == null || !colorpicker.HSVColor.Equals(hsv))
                        colorpicker.HSVColor = hsv;
                }

                colorpicker.forceDisplayRefresh();
            }

        }));

在 XAML 部分中,我使用以下内容将 RGBColor 设置为 Rectangle:

<Rectangle Height="100" x:Name="DisplayRectangle">
    <Rectangle.Fill>
        <SolidColorBrush Color="{Binding RGBColor, Mode=OneWay}" />
    </Rectangle.Fill>
</Rectangle>

(此时的 DataContext 是控件本身,因为我不想在所有绑定上使用 FindAncestor,所以在 ColorPicker 构造函数中,我的LayoutRoot.DataContext = this;LayoutRoot 是控件的根 Grid。)

我正在尝试在 View 中使用此控件。我有一个用于 View 的 VM,它实现INotifyPropertyChanged并具有一个 notify-property(是这样调用的吗?)

public Color Color
{
    get { return _color; }
    set
    {
        _color = value;
        RaisePropertyChanged(() => Color);
    }
}

我想用 Colorpicker 编辑这个属性(DataContext 是 VM):

<base:SimpleColorPicker RGBColor="{Binding Color}"/>

编辑本身有效。Color当我调整颜色选择器上的滑块时,属性会在 VM 中设置。

但是,当我加载已经设置了颜色的 VM 时,它Rectangle不会更新。滑块可以,并且所有设置都DependencyProperties设置为正确的值,但矩形的填充不会改变。(它保持Transparent默认值RGBColor DependencyProperty)。(再次,加载后,如果我调整滑块,矩形再次更新......)

已经失败的事情:

  • 我尝试使用 Brush 并直接绑定 Fill 属性(而不是 Fill.Color)
  • 我试过直接更新 Rectangle.Fill 上的绑定

还有什么可以尝试使这项工作发挥作用?

4

0 回答 0