什么是WPF添加对现有颜色编辑器的支持功能的方式?
问题描述:
我正在使用WPF扩展工具包的属性编辑器,我需要添加对使用此工具包附带的颜色编辑器编辑System.Drawing.Color
的支持。什么是WPF添加对现有颜色编辑器的支持功能的方式?
当前颜色编辑器通过颜色选择器组件完成其工作,并且似乎使用数据绑定将拾色器的SelectedColor
属性直接连接到编辑对象的颜色属性。不幸的是,工具包的编辑是通过返回一个DependencyProperty
来实现的,而不是被要求自己绑定它,所以it doesn't seem I can insert the (absolutely trivial) type conversion在那里。
我只看到两个这样做的其他方式:
- 复制整个拾色器,改变它编辑属性的类型。由于显而易见的原因,这是我想要做的最后一件事。
- 从类型为
System.Drawing.Color
的拾色器公开第二个Color属性,以便我的新颜色编辑器可以告诉属性网格绑定到该属性。但是我被告知拥有两个具有相同基础值的依赖属性是一个可怕的想法。
有没有更好的方法?
如果我真的应该在Color Picker组件中暴露两种Color属性,那么让它们“同步”的正确方法是什么?
答
您可以使用值转换器将数据绑定到System.Drawing.Color
。这适用于我的测试环境。
public class SystemDrawingColorConverter : IValueConverter
{
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
System.Windows.Media.Color color = (System.Windows.Media.Color)value;
return System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B);
}
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
System.Drawing.Color color = (System.Drawing.Color)value;
return System.Windows.Media.Color.FromArgb(color.A, color.R, color.G, color.B);
}
}
的XAML:用于测试视图模型
<Grid>
<Grid.Resources>
<local:SystemDrawingColorConverter x:Key="converter" />
</Grid.Resources>
<Grid.DataContext>
<local:VM />
</Grid.DataContext>
<tk:ColorPicker SelectedColor="{Binding Color, Converter={StaticResource converter}}" />
</Grid>
代码:
public class VM
{
private System.Drawing.Color _color;
public System.Drawing.Color Color
{
get { return _color; }
set { _color = value; }
}
}
完美!挖掘这个Property Grid的源代码,结果发现TypeEditor类实际上允许我指定一个IValueConverter。所以我的网格现在完全支持GDI颜色。谢谢! – 2012-01-02 13:52:58