如何将颜色转换为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> //...