从存储的数据中显示 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);
使用从 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);