Xamarin.Forms UWP项目中Segoe图标代码绑定问题求助
解决Xamarin.Forms UWP中Segoe图标绑定显示十六进制代码的问题
我来帮你搞定这个问题!你遇到的核心问题是XAML解析器和C#字符串对字符实体的处理逻辑不一样:当你在XAML里直接写👺时,XAML会自动把这个XML字符实体转换成对应的Unicode图标字符;但如果把这个实体字符串(比如"👺"或者转义后的"👺")赋值给后台属性再绑定,TextBlock只会把它当作普通文本输出,不会解析成图标。
下面给你几个可行的解决方案:
方案1:直接在C#中使用Unicode字符本身
这是最简单的方式,跳过字符实体,直接把图标对应的Unicode字符赋值给属性:
// 对于U+1F47A这类超出BMP的字符(比如Emoji),需要用UTF-16代理对表示 public string Icon { get; set; } = "\uD83D\uDC7A"; // 如果你用的编辑器支持直接输入图标,也可以直接写: // public string Icon { get; set; } = "👺";
这样绑定后,TextBlock就能直接显示图标了,记得要给TextBlock设置正确的字体(比如FontFamily="Segoe UI Emoji"或者Segoe MDL2 Assets,根据你用的图标字体来)。
方案2:后台解析字符实体为Unicode字符
如果你的图标实体是从外部来源(比如配置、接口)获取的,没法直接写Unicode字符,可以写一个转换方法把实体字符串转成对应字符:
public string ConvertEntityToUnicode(string entity) { // 提取十六进制部分:去掉开头的&#x和结尾的; var hexStr = entity.TrimStart('&', '#', 'x').TrimEnd(';'); // 把十六进制字符串转成整数 int unicodeCode = int.Parse(hexStr, System.Globalization.NumberStyles.HexNumber); // 转成对应的Unicode字符(自动处理代理对) return char.ConvertFromUtf32(unicodeCode); } // 使用示例 Icon = ConvertEntityToUnicode("👺");
方案3:使用值转换器(适合多场景绑定)
如果有很多地方需要做这种转换,推荐用UWP的IValueConverter来统一处理,这样绑定的时候自动转换:
第一步:创建转换器类
using System; using Windows.UI.Xaml.Data; namespace YourNamespace { public class EntityToUnicodeConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { if (value is string entityStr && !string.IsNullOrEmpty(entityStr)) { try { var hexStr = entityStr.TrimStart('&', '#', 'x').TrimEnd(';'); int unicodeCode = int.Parse(hexStr, System.Globalization.NumberStyles.HexNumber); return char.ConvertFromUtf32(unicodeCode); } catch { // 转换失败就返回原字符串,避免报错 return value; } } return value; } public object ConvertBack(object value, Type targetType, object parameter, string language) { // 不需要反向转换,直接抛异常或者返回null throw new NotImplementedException(); } } }
第二步:在XAML中引用并使用转换器
<!-- 在Page/UserControl的Resources里声明转换器 --> <Page.Resources> <local:EntityToUnicodeConverter x:Key="EntityToUnicodeConverter"/> </Page.Resources> <!-- 绑定的时候使用转换器 --> <win:TextBlock Text="{Binding Icon, Converter={StaticResource EntityToUnicodeConverter}}" FontSize="50" FontFamily="Segoe UI Emoji"/>
最后再提醒一下:一定要确认TextBlock的FontFamily设置正确,不同的Segoe图标字体对应不同的图标集合,比如Segoe MDL2 Assets是系统图标,Segoe UI Emoji是表情图标,选错了也会显示不出正确的图标哦!
内容的提问来源于stack exchange,提问作者Damien Doumer




