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

我想将System.Windows.Media.Color值转换为System.Windows.Media.Brush。 颜色值是数据绑定到Rectangle对象的填充属性。 填充属性需要一个Brush对象,所以我需要一个IValueConverter对象来执行转换。

有没有WPF中的内置转换器,还是我需要创build自己的? 如果有必要,我该如何创build自己的?

看来你必须创build你自己的转换器。 这里有一个简单的例子来开始:

public class ColorToSolidColorBrushValueConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (null == value) { return null; } // For a more sophisticated converter, check also the targetType and react accordingly.. if (value is Color) { Color color = (Color)value; return new SolidColorBrush(color); } // You can support here more source types if you wish // For the example I throw an exception Type type = value.GetType(); throw new InvalidOperationException("Unsupported type ["+type.Name+"]"); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { // If necessary, here you can convert back. Check if which brush it is (if its one), // get its Color-value and return it. throw new NotImplementedException(); } } 

要使用它,请在资源部分中声明它。

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

并在绑定中使用它作为静态资源:

  Fill="{Binding Path=xyz,Converter={StaticResource ColorToSolidColorBrush_ValueConverter}}" 

我没有testing过。 如果它不工作,发表评论。

我知道我对这个派对真的很迟,但是你不需要一个转换器。

你可以做

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

我想用HCL的方式,而不是Jens的方式,因为我有很多东西绑定到Color ,所以减less了重复和锅炉。 .Fill节点。

然而,当试图写它,ReSharper指向我的WPF工具包的ColorToSolidColorBrushConverter的实现。 您需要在主窗口/用户控制节点中包含以下名称空间声明:

 xmlns:Toolkit="clr-namespace:Microsoft.Windows.Controls.Core.Converters;assembly=WPFToolkit.Extended" 

然后在Window / UserControl资源中的一个静态资源:

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

那么你可以像HCL的答案那样做:

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

随着HCL答案的一些更多的增强,我testing了它 – 它的工作。

 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()"); } } 

Converter不需要在这里。 您可以在XAML定义一个Brush并使用它。 将Brush定义为Resource会更好,因此可以在其他需要的地方使用。

XAML如下所示:

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

转换器:

 [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:

 //... <converters:SolidBrushToColorConverter x:Key="SolidToColorConverter" /> //... <Color> <Binding Source="{StaticResource YourSolidColorBrush}" Converter="{StaticResource SolidToColorConverter}"> </Binding> </Color> //...