我有一个非常原始的colorpicker工具(在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 Height="100" x:Name="DisplayRectangle">
<Rectangle.Fill>
<SolidColorBrush Color="{Binding RGBColor, Mode=OneWay}" />
</Rectangle.Fill>
</Rectangle>
(此时DataContext是控件本身,因为我不想在所有绑定上使用FindAncestor,所以在ColorPicker构造函数中我有LayoutRoot.DataContext = this;
其中LayoutRoot是控件的根网格。)
我正在尝试在View中使用此控件。我有一个用于实现INotifyPropertyChanged
的View的VM,并且有一个notify-property(它是如何调用的?)
public Color Color
{
get { return _color; }
set
{
_color = value;
RaisePropertyChanged(() => Color);
}
}
我想用Colorpicker编辑这个属性(DataContext是VM):
<base:SimpleColorPicker RGBColor="{Binding Color}"/>
编辑本身有效。当我调整颜色选择器上的滑块时,会在VM中设置Color
属性。
但是,当我加载已经设置了颜色的VM时,Rectangle
将不会更新。滑块可以,并且所有DependencyProperties
都设置为正确的值,但Rectangle的Fill不会改变。 (它保留Transparent
,这是RGBColor DependencyProperty
的默认值。
(再次,加载后,如果我调整滑块,矩形会再次更新......)
已经失败的事情:
还有什么可以尝试使这项工作?