如何将颜色代码转换为media.brush?

时间:2011-07-24 18:20:54

标签: c# wpf

我有一个矩形,我想用颜色填充。当我写Fill = "#FFFFFF90"时,它显示错误:

  

无法将类型'string'隐式转换为'System.Windows.Media.Brush

请给我一些建议。

6 个答案:

答案 0 :(得分:96)

可以使用XAML读取系统使用的相同机制:类型转换器

var converter = new System.Windows.Media.BrushConverter();
var brush = (Brush)converter.ConvertFromString("#FFFFFF90");
Fill = brush;

答案 1 :(得分:28)

在代码中,您需要显式创建Brush实例:

Fill = new SolidColorBrush(Color.FromArgb(0xff, 0xff, 0x90))

答案 2 :(得分:2)

对于WinRT(Windows应用商店应用)

using Windows.UI;
using Windows.UI.Xaml.Media;

    public static Brush ColorToBrush(string color) // color = "#E7E44D"
    {
        color = color.Replace("#", "");
        if (color.Length == 6)
        {
            return new SolidColorBrush(ColorHelper.FromArgb(255,
                byte.Parse(color.Substring(0, 2), System.Globalization.NumberStyles.HexNumber),
                byte.Parse(color.Substring(2, 2), System.Globalization.NumberStyles.HexNumber),
                byte.Parse(color.Substring(4, 2), System.Globalization.NumberStyles.HexNumber)));
        }
        else
        {
            return null;
        }
    }

答案 3 :(得分:1)

很抱歉这么晚才能参加派对!我在WinRT中遇到了类似的问题。我不确定你是使用WPF还是WinRT,但它们在某些方面确实有所不同(有些方面比其他方式更好)。希望这将有助于所有人,无论他们身处何种情况。

您可以随时使用我创建的转换器类中的代码重新使用并在您的C#代码隐藏或您使用它的任何地方执行操作:

我的意图是可以使用6位(RGB)或8位(ARGB)Hex值。

所以我创建了一个转换器类:

public class StringToSolidColorBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var hexString = (value as string).Replace("#", "");

        if (string.IsNullOrWhiteSpace(hexString)) throw new FormatException();
        if (hexString.Length != 6 || hexString.Length != 8) throw new FormatException();

        try
        {
            var a = hexString.Length == 8 ? hexString.Substring(0, 2) : "255";
            var r = hexString.Length == 8 ? hexString.Substring(2, 2) : hexString.Substring(0, 2);
            var g = hexString.Length == 8 ? hexString.Substring(4, 2) : hexString.Substring(2, 2);
            var b = hexString.Length == 8 ? hexString.Substring(6, 2) : hexString.Substring(4, 2);

            return new SolidColorBrush(ColorHelper.FromArgb(
                byte.Parse(a, System.Globalization.NumberStyles.HexNumber),
                byte.Parse(r, System.Globalization.NumberStyles.HexNumber),
                byte.Parse(g, System.Globalization.NumberStyles.HexNumber),
                byte.Parse(b, System.Globalization.NumberStyles.HexNumber)));
        }
        catch
        {
            throw new FormatException();
        }
    }

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

将其添加到我的App.xaml中:

<ResourceDictionary>
    ...
    <converters:StringToSolidColorBrushConverter x:Key="StringToSolidColorBrushConverter" />
    ...
</ResourceDictionary>

在我的View的Xaml中使用它:

<Grid>
    <Rectangle Fill="{Binding RectangleColour,
               Converter={StaticResource StringToSolidColorBrushConverter}}"
               Height="20" Width="20" />
</Grid>

有魅力!

旁注...... 不幸的是,WinRT没有得到 H.B。建议的System.Windows.Media.BrushConverter;所以我需要另一种方式,否则我会创建一个从SolidColorBrush字符串属性返回RectangleColour(或类似)的VM属性。

答案 4 :(得分:0)

为简单起见,您可以创建扩展程序: -

    public static SolidColorBrush ToSolidColorBrush(this string hex_code)
    {
        return (SolidColorBrush)new BrushConverter().ConvertFromString(hex_code);
    }

然后使用: -

 SolidColorBrush accentBlue = "#3CACDC".ToSolidColorBrush();

答案 5 :(得分:-2)

您使用的是什么版本的WPF?我尝试了3.5和4.0,并且Fill =“#FF000000”在XAML中应该可以正常工作。但是,如果没有,则有另一种语法。这是我用两种不同方式测试的3.5 XAML。更好的是使用资源。

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Rectangle Height="100" HorizontalAlignment="Left" Margin="100,12,0,0" Name="rectangle1" Stroke="Black" VerticalAlignment="Top" Width="200" Fill="#FF00AE00" />
    <Rectangle Height="100" HorizontalAlignment="Left" Margin="100,132,0,0" Name="rectangle2" Stroke="Black" VerticalAlignment="Top" Width="200" >
        <Rectangle.Fill>
            <SolidColorBrush Color="#FF00AE00" />
        </Rectangle.Fill>
    </Rectangle>
</Grid>