You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动