【问题标题】:Using Material Design Icons with Xamarin Forms - What Am I Missing?将 Material Design 图标与 Xamarin 表单一起使用 - 我错过了什么?
【发布时间】:2020-12-21 19:43:41
【问题描述】:

我正在尝试修改默认的 Xamarin Forms (Flyout) 应用程序模板,以将 Material Design 图标用于 FlyoutItem 图标,而不是提供的 .png 文件。我曾尝试关注this blog post by James Montemagno,并尝试使用他的Hanselman.Forms 项目作为参考......但我错过了一些东西。

注意: 此时,我无法使用 iPhone 或 Mac,所以我只专注于 Android 项目。

我做了以下步骤:

  1. materialdesignicons-webfont.ttf 文件导入Assets 文件夹,并仔细检查其Build Action 是否设置为AndroidAsset
  2. App.xaml 文件中添加了以下内容:
<OnPlatform x:Key="MaterialFontFamily" x:TypeArguments="x:String">
   <On Platform="Android" Value="materialdesignicons-webfont.ttf#Material Design Icons" />
</OnPlatform>

<x:String x:Key="IconAbout">&#xf2fd;</x:String>
  1. 修改 AppShell.xaml 以更改图标:
<FlyoutItem Title="About">
   <FlyoutItem.Icon>
      <FontImageSource Glyph="{StaticResource IconAbout}"
                       FontFamily="{StaticResource MaterialFontFamily}" 
                       Color="Black"/>
   </FlyoutItem.Icon>
   <ShellContent Route="AboutPage" ContentTemplate="{DataTemplate local:AboutPage}" />
</FlyoutItem>

这是 Hanselman.Forms 项目的 TabItem 的直接副本 - 我认为 FontFamily 必须是 DynamicResource,但显然不是,因为它在该项目中按原样工作,但在我的任何一种方式下都不起作用 - 图标始终为空白(实际上,如果我将 Glyph 更改为字母 A 我会得到一个图标的“A”,但这并没有真正的帮助)。

我错过了一些我看不到的愚蠢的小细节。

【问题讨论】:

  • 那个James的博客是老版本,看这个Embedded Fonts,很容易实现。
  • 并贴上标签来测试你的字体设置。
  • 正如我在下面对@Tommy99 所说的那样——这是一个很好的替代方案,但我的目标是了解我所忽略的内容——我的理解存在差距,不同的实现无法填补。一旦我得到这个工作,我肯定会重构这种方法!
  • 好的。让我们从&lt;Label Text="&amp;#xf2fd;" FontFamily="{StaticResource MaterialFontFamily}"&gt;开始,那么标签显示OK了吗?
  • @Shaw - 不;它没有。尝试实施您的替代方案导致我的字形代码错误(请参阅我发布的答案)。谢谢。

标签: android xamarin xamarin.forms app.xaml


【解决方案1】:

我已经开始工作了。

首先,到这个 GitHub repo 下载这个材料字体系列作为 .tff 文件。点击 repo 中的“字体”文件并下载MaterialIcons-Regular.ttf

链接:https://github.com/google/material-design-icons

将 .tff 文件放入您的共享项目中。

现在引用 assemblyinfo.cs 文件中的字体,如下所示:

[assembly: ExportFont("MaterialIcons-Regular.ttf", Alias = "Material")]

在 .tff 文件上将构建操作设置为 '嵌入式资源'。不要忘记这一步!

转到此页面https://github.com/google/material-design-icons/blob/master/font/MaterialIcons-Regular.codepoints - 查看所有材料代码点。

在这种情况下,我将使用“警报添加”图标作为示例(因为为什么不这样做)。如果您想使用“警报添加”图标 - 找到“警报添加”代码点。在这种情况下,'alarm-add' 图标的 codepoint 的代码是 e856

将以下代码粘贴到您的 shell 中:

      <ShellContent Title="About"
                      ContentTemplate="{DataTemplate local:AboutPage}"
                      >
            <ShellContent.Icon>
                <FontImageSource FontFamily="Material"
                                 Color="White"
                                 Glyph="&#xe856;">
                </FontImageSource>
            </ShellContent.Icon>
            
            
        </ShellContent>

如果您按照所有步骤操作 - 结果应该是这样的:

如果 - 有任何机会 - 你想使用材料图标在你的外壳之外你可以创建一个标签,它的字体系列设置为 MaterialText 属性你可以设置适当的代码点。请记住在代码点之前包含&amp;#x - 并始终以分号结束。

您可以根据自己的喜好自定义颜色和图标 - 只需在 代码点文档 中搜索您想要的图标,然后粘贴标识该特定图标的代码点。

【讨论】:

  • 这当然是一个很好的替代方案,但我的目标是了解我忽略的内容 - 我的理解存在差距,其他实现无法填补。
  • @ScottBaker 如果你想使用材料字体,请阅读dev.to/peedroca/material-font-icons-on-xamarin-forms-2a9h。我认为您的做法并不完全正确 - 如果别无选择,请选择最简单的路线。
  • @ScottBaker 请查看我更新后的答案。
  • 这是另一个不同的实现。我明白你的意思,但是这个实现应该可以工作......我想知道为什么它不能,而不是如何解决它。
【解决方案2】:

错误的来源在这里:

<x:String x:Key="IconAbout">&#xf2fd;</x:String>

将该字符代码更改为&amp;#xf02df; 使一切正常 - 缺少一个零,结果是混乱。非常感谢@shaw 和@tommy99 - 尝试实施他们的答案(但仍然无法正常工作)让我找到了解决方案。感谢我支持他们的解决方案/cmets。

【讨论】:

  • 一切都好,对我来说,链接的主要区别在于它需要将一份字体文件副本放入共享项目中,而不是将它们放在任何地方。其他步骤非常相似,因为您已经开始工作了。
  • 避免混淆的更好方法是将静态类中的字形代码定义为字符串属性,并处理它们的显式描述名称而不是它们的值(代码)。 stackoverflow.com/a/65095438/5228202
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 2018-04-22
  • 2011-10-22
  • 2014-12-24
  • 1970-01-01
  • 2023-03-10
  • 2019-07-17
相关资源
最近更新 更多