我有一个非常原始的颜色选择器工具(在 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 上的绑定
还有什么可以尝试使这项工作发挥作用?