代码之家  ›  专栏  ›  技术社区  ›  dthrasher

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

  •  45
  • dthrasher  · 技术社区  · 14 年前

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

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

    7 回复  |  直到 6 年前
        1
  •  58
  •   Ivar    6 年前

    似乎你必须创建自己的转换器。下面是一个简单的例子:

    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}}"
    

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

        2
  •  127
  •   Jens    13 年前

    我知道我参加聚会真的很晚,但你不需要一个转换器。

    你可以做到

    <Rectangle>
        <Rectangle.Fill>
            <SolidColorBrush Color="{Binding YourColorProperty}" />
        </Rectangle.Fill>
    </Rectangle>
    
        3
  •  7
  •   Jackson Pope    9 年前

    我想用HCL的方式,而不是Jens的方式,因为我有很多事情与 Color 这样就减少了重复和锅炉盘 .Fill 节点。

    然而,当试图写它时,雷斯哈珀指给我看 WPF Toolkit 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}}" />
    
        4
  •  5
  •   Kylo Ren    8 年前

    Converter 这里不需要。您可以定义 Brush 在里面 XAML 并使用它。最好定义 刷子 作为一个 Resource 所以可以在其他需要的地方使用。

    XAML 如下:

    <Window.Resources>
        <SolidColorBrush Color="{Binding ColorProperty}" x:Key="ColorBrush" />
    </Window.Resources>
    <Rectangle Width="200" Height="200" Fill="{StaticResource ColorBrush}" />
    
        5
  •  3
  •   G.Y    11 年前

    随着对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()");
        }
    
    }
    
        6
  •  1
  •   Stacked Emily M    10 年前

    转换器:

    [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>
    //...
    
        7
  •  1
  •   Norman    6 年前

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