什么';WPF是如何向现有的颜色编辑器添加对该功能的支持的?

什么';WPF是如何向现有的颜色编辑器添加对该功能的支持的?,wpf,dependency-properties,color-picker,Wpf,Dependency Properties,Color Picker,我正在使用WPF扩展工具包的属性编辑器,我需要使用此工具包附带的颜色编辑器添加对编辑System.Drawing.Color的支持 当前颜色编辑器通过颜色选择器组件完成其工作,并且似乎使用数据绑定将颜色选择器的SelectedColor属性直接连接到已编辑对象的颜色属性。不幸的是,工具箱的编辑器是通过返回一个要绑定的dependencProperty来实现的,而不是通过要求自己绑定来实现的,所以就没有了 我只看到其他两种方法: 复制整个颜色选择器,更改其编辑的特性的类型。出于显而易见的原因,这

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

当前颜色编辑器通过颜色选择器组件完成其工作,并且似乎使用数据绑定将颜色选择器的
SelectedColor
属性直接连接到已编辑对象的颜色属性。不幸的是,工具箱的编辑器是通过返回一个要绑定的
dependencProperty
来实现的,而不是通过要求自己绑定来实现的,所以就没有了

我只看到其他两种方法:

  • 复制整个颜色选择器,更改其编辑的特性的类型。出于显而易见的原因,这是我最不想做的事情
  • 从颜色选择器中公开第二个颜色属性,类型为
    System.Drawing.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>

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

完美的翻阅这个属性网格的源代码,发现TypeEditor类实际上允许我指定一个IValueConverter。因此,我的网格现在完全支持GDI颜色。谢谢完美的翻阅这个属性网格的源代码,发现TypeEditor类实际上允许我指定一个IValueConverter。因此,我的网格现在完全支持GDI颜色。谢谢