从存储的数据中显示 Xamarin 字体图标

Display Xamarin Font Icons From Stored Data

使用从 Web 服务提取的数据显示字体图标的最佳方式是什么?我想存储图标的值并显示与其余信息类似的图标,但带有自定义字体图标。

我有一个 xamarin 表单应用程序成功处理来自网络服务的数据。这是我的模型。

public class TypeModel
{
    [PrimaryKey]
    public int pType { get; set; }

    public int fDepartment { get; set; }

    public string Title { get; set; }

    public string Description { get; set; }

    public string Icon { get; set; }

    public string Version { get; set; }

}

我的字体图标也像 [1] 中的教程一样成功运行:https://montemagno.com/using-font-icons-in-xamarin-forms-goodbye-images-hello-fonts/ 我的图标存储在这个 class 下。尝试过渡到使用 Web 服务或数组管理这些值(如果我现在也有的话)。

public const string IconCheckMark = "\uf12c";

public const string IconSearchGlass = "\uf349";

public const string IconQuestionMark = "\uf2d6";

public const string IconQuestionCircle = "\uf2d7";

但这就是我的问题开始的地方。我的 ViewModel 正在做创建集合的工作。如何分配一个可以正确显示和匹配的值。

public ObservableCollection<TypeModel> TypesCollection { get; set; }

TypesCollection.Clear();

IEnumerable<TypeModel> types = await DataSource.GetTypes();

foreach (var key in types)
{
    \Original value doesn't display correctly, shows like \U f 1 2 c when debugging on emulator
    \key.Icon = key.Icon;

    \Works and displays correctly but static data displays one icons for all
    \key.Icon = "\uf12c";

    \Works and displays correctly but static data displays one icons for all
    \key.Icon = FontClass.IconCheckMark;

    TypesCollection.Add(key);    
}

xaml 个文件之后就很简单了。

<ResourceDictionary>

    <OnPlatform x:Key="IconFonts" x:TypeArguments="x:String">

        <On Platform="iOS" Value="Material Design Icons"></On>

        <On Platform="Android" Value="IconFonts.ttf#Material Design Icons"></On>

        <On Platform="UWP" Value="/Assets/IconFonts.ttf#Material Design Icons"></On>

    </OnPlatform>

</ResourceDictionary>

<Label FontFamily="{StaticResource IconFonts}" Text="{Binding Icon}"></Label>

key.Icon 的类型是什么?如果是字符串,可以去掉字符之间的白色space:

key.Icon  = key.Icon.Replace(" ", "").ToLower();

从微软开发社区得到答案。首先解释发生了什么:当您将以下内容放入 C# 代码中时:

图标=“\uf2d6”

“\uf2d6”实际上不是文字字符串,而是在编译时最终成为单个字符(由该 UTF 代码表示的字符)。换句话说,“\u”意味着后面是一个字符的十六进制代码,而整个“字符串”最终将只是那个字符。如果在上述分配后检查图标 属性,您会看到 属性 只包含一个字符,而不是“\uf2d6”字符串。

因此,当您从图标 属性 中的 Web 服务获取“2d6”,然后尝试在它之前添加“\uf”时,您并不是在为字符创建转义序列,而是在添加到字符串文字。因此,您需要做的是将十六进制数字的字符串解析为 int,然后将其转换为 char,然后将该字符分配给您的图标 属性。您可以按如下方式执行此操作(将其放在您发送给我的示例中的 foreach 循环中):

string utfCode = $"f{key.Icon}"; // Adds the leading “f” to make it a correct hex number for the desired UTF code.
int character = int.Parse(utfCode, System.Globalization.NumberStyles.HexNumber); // parses that string literal into an int
key.Icon = ((char)character).ToString(); // casts that int to a char and then gets the string representation for that character and assigns it back to your Icon property

TypesCollection.Add(key);