向现有颜色编辑器添加对此功能的支持的 WPF 方法是什么?



我正在使用WPF扩展工具包的属性编辑器,我需要使用该工具包附带的颜色编辑器添加对编辑System.Drawing.Color的支持。

当前的颜色编辑器通过颜色选择器组件完成它的工作,并且似乎使用数据绑定将颜色选择器的SelectedColor属性直接连接到被编辑对象的颜色属性。不幸的是,Toolkit的编辑器是通过返回一个要绑定到的DependencyProperty来实现的,而不是被要求自己绑定它,所以我似乎不能在那里插入(绝对微不足道的)类型转换。

我只看到另外两种方法:

    复制整个颜色选择器,改变它编辑的属性的类型。这是我最不想做的事情,原因很明显。
  • 从颜色选择器中暴露第二个颜色属性,类型为System.Drawing.Color,这样我的新颜色编辑器就可以告诉属性网格绑定到那个属性。但是有人告诉我,拥有两个具有相同底层值的依赖属性是一个糟糕的主意。

有更好的方法吗?

如果我真的应该在Color Picker组件中公开两种颜色属性,那么保持它们"同步"的正确方法是什么?

您可以使用值转换器将数据绑定到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; }
    }
}

最新更新