Wpf 如何在XAML中将颜色转换为画笔?

Wpf 如何在XAML中将颜色转换为画笔?,wpf,data-binding,xaml,colors,converter,Wpf,Data Binding,Xaml,Colors,Converter,我想将System.Windows.Media.Color值转换为System.Windows.Media.Brush。颜色值被数据绑定到矩形对象的填充属性。Fill属性接受笔刷对象,因此我需要一个IValueConverter对象来执行转换 WPF中是否有内置转换器,或者我是否需要创建自己的转换器?如果有必要,我如何创建自己的转换器?看来您必须创建自己的转换器。下面是一个简单的例子: 公共类ColorToSolidColorBrushValueConverter:IValueConverter

我想将System.Windows.Media.Color值转换为System.Windows.Media.Brush。颜色值被数据绑定到矩形对象的填充属性。Fill属性接受笔刷对象,因此我需要一个IValueConverter对象来执行转换


WPF中是否有内置转换器,或者我是否需要创建自己的转换器?如果有必要,我如何创建自己的转换器?

看来您必须创建自己的转换器。下面是一个简单的例子:

公共类ColorToSolidColorBrushValueConverter:IValueConverter{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性){
if(null==值){
返回null;
}
//对于更复杂的转换器,还应检查targetType并做出相应反应。。
if(值为颜色){
颜色=(颜色)值;
返回新的SolidColorBrush(颜色);
}
//如果愿意,您可以在此处支持更多源类型
//例如,我抛出一个异常
Type Type=value.GetType();
抛出新的InvalidOperationException(“不支持的类型[“+type.Name+”]”);
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性){
//如果有必要,你可以在这里转换回来。检查它是否是画笔(如果是一个),
//获取其颜色值并返回它。
抛出新的NotImplementedException();
}
}
要使用它,请在资源部分声明它

<local:ColorToSolidColorBrushValueConverter  x:Key="ColorToSolidColorBrush_ValueConverter"/>

我还没有测试过。如果不起作用,请发表评论。

我知道我参加聚会真的迟到了,但你不需要转换器

你可以

<Rectangle>
    <Rectangle.Fill>
        <SolidColorBrush Color="{Binding YourColorProperty}" />
    </Rectangle.Fill>
</Rectangle>

我想用HCL的方式而不是Jens的方式来做这件事,因为我有很多东西都绑定到了
颜色上,所以复制和填充
.Fill
节点更少

然而,当试图编写它时,ReSharper向我指出了ColorToSolidColorBrushConverter的实现。您需要在主窗口/UserControl节点中包含以下命名空间声明:

xmlns:Toolkit="clr-namespace:Microsoft.Windows.Controls.Core.Converters;assembly=WPFToolkit.Extended"
然后是窗口中的静态资源/UserControl资源:

<Toolkit:ColorToSolidColorBrushConverter x:Key="colorToSolidColorBrushConverter" />

然后你可以像HCL的回答那样做:

<Rectangle Fill="{Binding Color, Converter={StaticResource colorToSolidColorBrushConverter}}" />

通过对HCL答案的进一步增强,我对它进行了测试——它是有效的

public class ColorToSolidColorBrushValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return null;

        if (value is Color)
            return new SolidColorBrush((Color)value);

        throw new InvalidOperationException("Unsupported type [" + value.GetType().Name + "], ColorToSolidColorBrushValueConverter.Convert()");
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return null;

        if (value is SolidColorBrush)
            return ((SolidColorBrush)value).Color;

        throw new InvalidOperationException("Unsupported type [" + value.GetType().Name + "], ColorToSolidColorBrushValueConverter.ConvertBack()");
    }

}
转换器:

[ValueConversion(typeof(SolidColorBrush), typeof(Color))]
public class SolidBrushToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!(value is SolidColorBrush)) return null;
        var result = (SolidColorBrush)value;
        return result.Color;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
XAML:

/。。。
//...
//...

此处不需要
转换器。您可以在
XAML
中定义
画笔
,并使用它。最好将
画笔
定义为
资源
,以便可以在其他需要的地方使用

XAML
如下所示:

<Window.Resources>
    <SolidColorBrush Color="{Binding ColorProperty}" x:Key="ColorBrush" />
</Window.Resources>
<Rectangle Width="200" Height="200" Fill="{StaticResource ColorBrush}" />

除了HCLs回答:如果您不想关心是使用System.Windows.Media.Color还是System.Drawing.Color,您可以使用此转换器,它同时接受以下两种:

public class ColorToSolidColorBrushValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        switch (value)
        {
            case null:
                return null;
            case System.Windows.Media.Color color:
                return new SolidColorBrush(color);
            case System.Drawing.Color sdColor:
                return new SolidColorBrush(System.Windows.Media.Color.FromArgb(sdColor.A, sdColor.R, sdColor.G, sdColor.B));
        }

        Type type = value.GetType();
        throw new InvalidOperationException("Unsupported type [" + type.Name + "]");
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
} 

可能重复:我认为这不是重复。我想从一个颜色对象转换,而不是像“Red”这样的字符串值。我想把它实现为一个XAML转换器,而不是用C#code behind执行转换。这个解决方案比公认的答案要好得多。谢谢虽然我喜欢这种解决方案,但它确实会导致此处所述的恼人警告:如果您对
YourColorProperty
与我的相似之处感到困惑,那么它很可能是一个可以从C#code-behind.com中当前XAML范围查看的属性。。我注意到简的回答。。准确地说:)非常感谢克里斯·瓦伦丁。尽管Jens的回答非常优雅,但在我的情况下,我无法使用它,只能使用转换器。或者,在我的例子中,我看不到如何实现SolidColorBrush。
<Window.Resources>
    <SolidColorBrush Color="{Binding ColorProperty}" x:Key="ColorBrush" />
</Window.Resources>
<Rectangle Width="200" Height="200" Fill="{StaticResource ColorBrush}" />
public class ColorToSolidColorBrushValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        switch (value)
        {
            case null:
                return null;
            case System.Windows.Media.Color color:
                return new SolidColorBrush(color);
            case System.Drawing.Color sdColor:
                return new SolidColorBrush(System.Windows.Media.Color.FromArgb(sdColor.A, sdColor.R, sdColor.G, sdColor.B));
        }

        Type type = value.GetType();
        throw new InvalidOperationException("Unsupported type [" + type.Name + "]");
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}