我有一个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并使用它,那么它可以正常工作。
答案 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));
}