WPF 自定义颜色 MarkupExtension 无法应用于 SolidColorBrush.Color
WPF Custom Color MarkupExtension cannot be applied on SolidColorBrush.Color
我正在尝试实现 MarkupExtension 以将 rgba int 值转换为 System.Windows.Media.Color。
但是我遇到了一个例外
An object of the type "UIH:Color" cannot be applied to a property that expects the type "System.Windows.Media.Color"
实现如下:
[MarkupExtensionReturnType(typeof(System.Windows.Media.Color))]
public class Color : MarkupExtension
{
public static explicit operator System.Windows.Media.Color(Color color)
{
return color.ToColor();
}
public byte R { get; set; }
public byte G { get; set; }
public byte B { get; set; }
public byte? A { get; set; }
public System.Windows.Media.Color ToColor()
{
if (A.HasValue)
{
return System.Windows.Media.Color.FromArgb(A.Value, R, G, B);
}
else
{
return System.Windows.Media.Color.FromRgb(R, G, B);
}
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return ToColor();
}
}
然后我将颜色应用到纯色画笔
<uih:Color x:Key="background" R="79" G="113" B="133" />
<SolidColorBrush x:Key="backgroundBrush" Color="{StaticResource background}" options:Freeze="True" />
问题是您使用了错误的语法。您需要的不是静态资源,而是标记扩展语法:
<SolidColorBrush x:Key="backgroundBrush" Color="{uih:Color R=79, G=113 ,B=133}" />
这应该可以解决问题;)
编辑
如果您想重用颜色,那么正如@Clemens 指出的那样,您根本不需要标记扩展或新的 class,只需声明一个颜色资源即可:
<Color x:Key="Color" R="79" G="113" B="133"/>
<SolidColorBrush x:Key="backgroundBrush" Color="{StaticResource Color}" />
我正在尝试实现 MarkupExtension 以将 rgba int 值转换为 System.Windows.Media.Color。
但是我遇到了一个例外
An object of the type "UIH:Color" cannot be applied to a property that expects the type "System.Windows.Media.Color"
实现如下:
[MarkupExtensionReturnType(typeof(System.Windows.Media.Color))]
public class Color : MarkupExtension
{
public static explicit operator System.Windows.Media.Color(Color color)
{
return color.ToColor();
}
public byte R { get; set; }
public byte G { get; set; }
public byte B { get; set; }
public byte? A { get; set; }
public System.Windows.Media.Color ToColor()
{
if (A.HasValue)
{
return System.Windows.Media.Color.FromArgb(A.Value, R, G, B);
}
else
{
return System.Windows.Media.Color.FromRgb(R, G, B);
}
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return ToColor();
}
}
然后我将颜色应用到纯色画笔
<uih:Color x:Key="background" R="79" G="113" B="133" />
<SolidColorBrush x:Key="backgroundBrush" Color="{StaticResource background}" options:Freeze="True" />
问题是您使用了错误的语法。您需要的不是静态资源,而是标记扩展语法:
<SolidColorBrush x:Key="backgroundBrush" Color="{uih:Color R=79, G=113 ,B=133}" />
这应该可以解决问题;)
编辑
如果您想重用颜色,那么正如@Clemens 指出的那样,您根本不需要标记扩展或新的 class,只需声明一个颜色资源即可:
<Color x:Key="Color" R="79" G="113" B="133"/>
<SolidColorBrush x:Key="backgroundBrush" Color="{StaticResource Color}" />