Android 在Xamarin表单中使用材质设计图标-我缺少什么?

Android 在Xamarin表单中使用材质设计图标-我缺少什么?,android,xamarin,xamarin.forms,app.xaml,Android,Xamarin,Xamarin.forms,App.xaml,我正在尝试修改默认的Xamarin Forms弹出应用程序模板,以使用弹出项图标的材质设计图标,而不是提供的.png文件。我试着跟随,试着用他的项目作为参考。。。但是我错过了一些东西 注意:在这一点上,我无法访问iPhone或Mac,所以我只专注于Android项目 我已完成以下步骤: 将materialdesignicons-webfont.ttf文件导入到Assets文件夹中,并仔细检查其构建操作是否设置为AndroidAsset。 将以下内容添加到App.xaml文件: &xf2fd; 修

我正在尝试修改默认的Xamarin Forms弹出应用程序模板,以使用弹出项图标的材质设计图标,而不是提供的.png文件。我试着跟随,试着用他的项目作为参考。。。但是我错过了一些东西

注意:在这一点上,我无法访问iPhone或Mac,所以我只专注于Android项目

我已完成以下步骤:

将materialdesignicons-webfont.ttf文件导入到Assets文件夹中,并仔细检查其构建操作是否设置为AndroidAsset。 将以下内容添加到App.xaml文件: &xf2fd; 修改AppShell.xaml以更改图标: 这是Hanselman.Forms项目的TabItem的直接副本-我认为FontFamily必须是DynamicSource,但显然不是,因为它在该项目中按原样工作,但在我的项目中都不工作-图标实际上总是空白的,如果我将图示符更改为字母a,我会得到一个a作为图标,但这并不是很有帮助


我遗漏了一些我看不见的愚蠢的小细节。

我已经让它工作了

首先,转到这个GitHub repo,并将此材质字体系列作为.tff文件下载。点击回购协议中的“字体”文件并下载MaterialIcons-Regular.ttf

链接:

将.tff文件放在共享项目中

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

[assembly: ExportFont("MaterialIcons-Regular.ttf", Alias = "Material")]
在.tff文件上将生成操作设置为“嵌入式资源”。不要忘记这一步

转到本页-查看所有材料代码点

在这种情况下,我将使用“报警添加”图标作为示例,因为为什么不使用。如果要使用“报警添加”图标,请查找“报警添加”代码点。在这种情况下,“报警添加”图标的代码点代码为e856

将以下代码粘贴到shell中:

      <ShellContent Title="About"
                      ContentTemplate="{DataTemplate local:AboutPage}"
                      >
            <ShellContent.Icon>
                <FontImageSource FontFamily="Material"
                                 Color="White"
                                 Glyph="&#xe856;">
                </FontImageSource>
            </ShellContent.Icon>
            
            
        </ShellContent>
如果您遵循所有步骤-结果应如下所示:

[assembly: ExportFont("MaterialIcons-Regular.ttf", Alias = "Material")]
如果您希望在外壳之外使用材质图标,您可以创建一个标签,将字体系列设置为“材质”,并将其设置为“文本”属性,您可以设置相应的代码点。请记住在代码点之前包含&x,并始终以分号结尾


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

我已经让它工作了

首先,转到这个GitHub repo,并将此材质字体系列作为.tff文件下载。点击回购协议中的“字体”文件并下载MaterialIcons-Regular.ttf

链接:

将.tff文件放在共享项目中

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

[assembly: ExportFont("MaterialIcons-Regular.ttf", Alias = "Material")]
在.tff文件上将生成操作设置为“嵌入式资源”。不要忘记这一步

转到本页-查看所有材料代码点

在这种情况下,我将使用“报警添加”图标作为示例,因为为什么不使用。如果要使用“报警添加”图标,请查找“报警添加”代码点。在这种情况下,“报警添加”图标的代码点代码为e856

将以下代码粘贴到shell中:

      <ShellContent Title="About"
                      ContentTemplate="{DataTemplate local:AboutPage}"
                      >
            <ShellContent.Icon>
                <FontImageSource FontFamily="Material"
                                 Color="White"
                                 Glyph="&#xe856;">
                </FontImageSource>
            </ShellContent.Icon>
            
            
        </ShellContent>
如果您遵循所有步骤-结果应如下所示:

[assembly: ExportFont("MaterialIcons-Regular.ttf", Alias = "Material")]
如果您希望在外壳之外使用材质图标,您可以创建一个标签,将字体系列设置为“材质”,并将其设置为“文本”属性,您可以设置相应的代码点。请记住在代码点之前包含&x,并始终以分号结尾


您可以根据自己的喜好定制颜色和图标-只需在codepoint文档中搜索所需的图标并粘贴标识该特定图标的codepoint即可。

错误来源如下:

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

将该字符代码更改为&xf02df;一切正常-一个缺零,结果是一片混乱。非常感谢@shaw和@tommy99——他们试图实现他们的答案,但仍然不起作用,这让我找到了解决方案。我已经更新了他们的解决方案/评论以表示感谢。

错误来源如下:

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

将该字符代码更改为&xf02df;一切正常-一个缺零,结果是一片混乱。非常感谢@shaw和@tommy99——他们试图实现他们的答案,但仍然不起作用,这让我找到了解决方案。我已经更新了他们的解决方案/评论以表示感谢。

詹姆斯的博客是一个旧版本,请检查此,易于实现。并放置一个标签来测试您的字体设置。正如我在下面对@Tommy99所说的——这是一个很好的选择,但我的目标是理解我忽略了什么——我的理解中存在一个空白,而这个空白不是由不同的实现来填补的。一旦我开始工作,我肯定会重构到这种方法!好吧让我们从那开始,标签看起来合适吗?@Shaw-nope;没有。试图实现你的替代方案导致我得到了一个错误的字形代码

见我贴出的答案。谢谢。James的博客是一个旧版本,检查这个,很容易实现。并放置一个标签来测试你的字体设置。正如我在下面对@Tommy99所说的——这是一个很好的选择,但我的目标是理解我忽略了什么——在我的理解上有一个差距,而不是通过不同的实现来填补。一旦我开始工作,我肯定会重构到这种方法!好吧让我们从那开始,标签看起来合适吗?@Shaw-nope;没有。试图实现您的替代方案导致我使用了一个错误的字形代码,请参阅我发布的答案。谢谢。这当然是一个很好的选择,但我的目标是理解我忽略了什么-我的理解中有一个空白,不是由不同的实现来填补的。@ScottBaker如果你想使用材料字体,请阅读。我不认为你做得完全正确-如果没有其他选择,请选择最简单的方法。@ScottBaker请查看我更新的答案。这是另一个不同的实现。我明白你的意思,但是这个实现应该可以工作。。。我想知道为什么没有,而不是如何解决它。这当然是一个很好的选择,但我的目标是了解我忽略了什么-我的理解中有一个空白,不是由不同的实现来填补的。@ScottBaker如果你想使用材料字体,请阅读。我不认为你做得完全正确-如果没有其他选择,请选择最简单的方法。@ScottBaker请查看我更新的答案。这是另一个不同的实现。我明白你的意思,但是这个实现应该可以工作。。。我想知道为什么没有,而不是如何解决它。好吧,对我来说,链接的主要区别在于它需要一份字体文件拷贝到共享项目中,而不是将它们放在任何地方。其他步骤非常类似,因为您已经让它工作了。避免混淆的更好方法是将静态类中的glyph代码定义为字符串属性,并处理它们的显式descriptif名称,而不是它们的值代码。好吧,对我来说,链接的主要区别在于它需要一份字体文件拷贝到共享项目中,而不是放在任何地方。其他步骤非常类似,因为您已经让它工作了。避免混淆的更好方法是将静态类中的glyph代码定义为字符串属性,并处理它们的显式descriptif名称,而不是它们的值代码。