我在我的WPF项目(Segoe UI Symbol)中使用符号字体来显示图标而无需处理图像。我可以使用以下XAML代码显示图标:
<customControlsc:CircularButton Header=""
FontFamily="{StaticResource Symbols}" />
这段代码很好用,但每次我想添加一个图标时都要查找图标代码('U + E109'),这不太方便。
所以我想,为什么不把我需要的所有符号代码放在资源文件中呢?我已经有一个资源文件来管理我的应用程序中的语言,所以我只添加了以下几行:
现在我使用以下XAML代码:
<cc:CircularButton Header="{Binding Strings.Symbol_Add, Source={StaticResource LangManager}}"
FontFamily="{StaticResource Symbols}" />
然而,它不起作用,我得到以下结果:
我不知道为什么,但WPF似乎将我的.resx文件中的特殊字符解释为字符串,而当符号代码直接放入我的XAML文件时它会正确解释它...
好的,现在我明白了。
在代码中,当您使用特殊字符序列时,例如“&amp;#xe109;”在WPF或C#中的“\ ue109”中,您实际上是用十六进制代码'E109'编写单个字符。
在.resx文件中,特殊字符序列“”保存为纯文本,而不是单个字符,因为.resx不依赖于您使用的语言。我发现使其工作的最简单方法是保存我想要使用的特殊字符的十六进制unicode标识符(也就是说,0xE109),然后将其转换为字符。
我只是使用转换器:
public class CodeToIconConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var str = (string)value; // str = "E109"
// create a char from the hex number "E109"
return (char)int.Parse(str, System.Globalization.NumberStyles.HexNumber);
}
// ...
XAML:
<cc:CircularButton Header="{Binding Strings.Symbol_Add, Source={StaticResource LangManager, Converter={StaticResource CodeToIconConverter}}"
FontFamily="{StaticResource Symbols}" />