用于将ARGB转换为XAML的可用十六进制的标记扩展

时间:2014-08-14 13:14:18

标签: c# wpf xaml

我有一个MarkupExtension,可以从您可以在XAML中使用的ARGB值返回Hex。

public class FromArgbExtension : MarkupExtension
{
    public FromArgbExtension() { }
    public FromArgbExtension(byte a, byte r, byte g, byte b)
    {
        A = a;
        R = r;
        G = g;
        B = b; 
    }

    public byte A { get; set; }
    public byte R { get; set; }
    public byte G { get; set; }
    public byte B { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    { 
        return Color.FromArgb(A, R, G, B);
    }
}

<DataGrid Background="{vl:FromArgbExtension 255, 217, 217, 217}"

我遇到的问题是它抛出了一个错误:&#39;设置属性&#39; System.Windows.Controls.Panel.Background&#39;抛出异常。&#39;但内在的例外是:{&#34;&#39;#FFD9D9D9&#39;不是属性的有效值&#39;背景&#39;。&#34;}

我不明白的是,如果我使用#FFD9D9D9并使用它,那么它可以正常工作。

2 个答案:

答案 0 :(得分:2)

Background属性需要Brush,您要返回Color。从SolidColorBrush创建Color并返回:

public override object ProvideValue(IServiceProvider serviceProvider) {
    SolidColorBrush solidColorBrush = new SolidColorBrush(Color.FromArgb(A, R, G, B));
    solidColorBrush.Freeze();
    return solidColorBrush;
}

答案 1 :(得分:1)

你只需要停下来思考一下......你想在Background属性(类型Brush)上使用你的标记扩展,如下所示:

<DataGrid Background="{vl:FromArgbExtension 255, 217, 217, 217}" ... />

但是,您的ProvideValue方法会返回Color

public override object ProvideValue(IServiceProvider serviceProvider)
{ 
    return Color.FromArgb(A, R, G, B);
}

因此,如果要在Brush属性上使用它,则标记扩展应返回Brush

public override object ProvideValue(IServiceProvider serviceProvider)
{ 
    return new SolidColorBrush(Color.FromArgb(A, R, G, B));
}