如何从字符串常量定义Color?静态类HEX色值资源字典失效问题
问题原因与解决方案
这问题我碰到过好几次啦!核心坑点在于类型不匹配:你的静态类里定义的颜色HEX值应该是字符串类型,但XAML中SolidColorBrush的Color属性需要的是System.Windows.Media.Color对象,而不是纯文本的HEX字符串。虽然编译不会报错,但运行时WPF无法自动完成字符串到Color的转换,最终就会显示成透明色。而Label的Text属性本身就接受字符串,所以用在那里完全正常。
先确认你的静态类(大概率是这种情况)
你静态类的定义应该类似这样:
public static class MyColors { public const string COLOR_1 = "#AABBCC"; }
这种字符串类型的HEX值,直接通过{x:Static}绑定到Color属性时,WPF无法识别,自然显示透明。
两种解决办法
办法一:把静态类字段改成Color类型(推荐)
直接在静态类中定义Color类型的字段,让XAML可以直接使用:
using System.Windows.Media; public static class MyColors { // 方式1:通过ColorConverter转换HEX字符串 public static readonly Color COLOR_1 = (Color)ColorConverter.ConvertFromString("#AABBCC"); // 方式2:直接用RGB值初始化(更高效) // public static readonly Color COLOR_1 = Color.FromRgb(0xAA, 0xBB, 0xCC); }
之后资源字典里的代码不用改,{x:Static n1:MyColors.COLOR_1}就能正确绑定到Color属性,Brush也能正常显示颜色了。
办法二:保留字符串,用转换器转换
如果一定要保留静态类里的字符串HEX值,那需要在XAML里用ColorConverter把字符串转成Color对象:
<SolidColorBrush x:Key="Color1Brush" Color="{Binding Source={x:Static n1:MyColors.COLOR_1}, Converter={x:Static System.Windows.Media.ColorConverter.Default}}" />
这样WPF就会明确知道要把字符串#AABBCC转换成对应的Color对象,颜色就能正常显示了。
额外小技巧
如果你的场景经常用到Brush而不是单纯的Color,也可以直接在静态类里定义Brush类型的字段:
public static class MyColors { public static readonly SolidColorBrush COLOR_1_BRUSH = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#AABBCC")); }
之后在XAML里可以直接引用:
<Button Background="{x:Static n1:MyColors.COLOR_1_BRUSH}" />
或者放到资源字典里复用:
<StaticResourceExtension x:Key="Color1Brush" ResourceKey="{x:Static n1:MyColors.COLOR_1_BRUSH}" />
内容的提问来源于stack exchange,提问作者Gregor Mohorko
相关产品推荐
相关产品推荐

