使用Font Awesome更改WPF中的字体图标
我正在使用Font Awesome的图标来渲染C#WPF应用程序中的基本字体图像。 在运行期间,当我尝试更改TextBlock以显示不同的字体图标但显示的是unicode表示而不是字体图标时。
我已经创建了一个示例应用程序来显示它。 单击任一按钮时,它会将TextBlock的Text属性替换为相应图标的unicode。 项目中有一个Resources文件夹,其中FontAwesome.ttf字体文件作为构建资源,TextBlock的FontFamily属性引用该文件。
这是我的示例应用程序的源代码:
代码隐藏:
namespace FontAwesomeTest { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void btnGlass_Click(object sender, RoutedEventArgs e) { tblkFontIcon.Text = ""; } private void btnMusic_Click(object sender, RoutedEventArgs e) { tblkFontIcon.Text = ""; } private void btnSearch_Click(object sender, RoutedEventArgs e) { tblkFontIcon.Text = ""; } } }
XAML:
我使用以下教程将Font Awesome合并到我的应用程序中http://www.codeproject.com/Tips/634540/Using-Font-Icons
所以从本质上讲,我如何更改Icon但是有一个Icon显示 – 而不是Unicode?
提前致谢。
UPDATE
我在这个主题上发现了一个不同的post – 在wpf中添加图标字体我觉得这应该更有可能是你想要的。
确保将您的字体添加为资源。 然后,使用以下字符串:
在上面的字符串中,我假设字体的名称( 不是字体的文件名)是FontAwesome。
你只需要:
- 将Font添加到项目中,假设您将它们放入文件夹“fonts”
- 将构建操作更改为资源 而非 嵌入资源
- 添加样式以设置字体系列,如上面的代码片段,并将
TextBlock.Text
设置为您喜欢的图标,并将样式应用于TextBlock。
如果要通过更新TextBlock.Text
属性来更改图标,则应使用支持的unicode字符串设置Text
属性。
尝试类似的东西
tblkFontIcon.Text = "\uf000";
而不是
tblkFontIcon.Text = "";
如果您使用的是使用字体图标的代码
然后你可能错过了那篇文章中的“工作原理”部分。 您应该使用该标记扩展,而不是使用TextBlock.Text属性。
在他的示例代码中:
注意WpfTools:ImageFromFont
,它是Markup Extention ,它允许xaml解析器转换
{WpfTools:ImageFromFont Text=, FontFamily=/RibbonFontIconSample;component/Resources/#FontAwesome, Brush=Brown}
到ImageSource
并分配给LargeImageSource
属性。
所以在你的xaml中,你可以用Image
替换TextBlock
,那么它应该是这样的:
如果要更改图标,则必须自己更改ImageSource
,只需按照使用字体图标创建自己的方法,或者只是从该教程中复制以下代码。
private static ImageSource CreateGlyph(string text, FontFamily fontFamily, FontStyle fontStyle, FontWeight fontWeight, FontStretch fontStretch, Brush foreBrush) { if (fontFamily != null && !String.IsNullOrEmpty(text)) { Typeface typeface = new Typeface(fontFamily, fontStyle, fontWeight, fontStretch); GlyphTypeface glyphTypeface; if (!typeface.TryGetGlyphTypeface(out glyphTypeface)) throw new InvalidOperationException("No glyphtypeface found"); ushort[] glyphIndexes = new ushort[text.Length]; double[] advanceWidths = new double[text.Length]; for (int n = 0; n < text.Length; n++) { ushort glyphIndex = glyphTypeface.CharacterToGlyphMap[text[n]]; glyphIndexes[n] = glyphIndex; double width = glyphTypeface.AdvanceWidths[glyphIndex] * 1.0; advanceWidths[n] = width; } GlyphRun gr = new GlyphRun(glyphTypeface, 0, false, 1.0, glyphIndexes, new Point(0, 0), advanceWidths, null, null, null, null, null, null); GlyphRunDrawing glyphRunDrawing = new GlyphRunDrawing(foreBrush, gr); return new DrawingImage(glyphRunDrawing); } return null; }
我知道这是一个老问题,但Font Awesome有一个名为FontAwesome.UWP和FontAwesome.WPF的NuGet包。 只需下载其中一个。
如果您将使用图标导入跟随命名空间到您的XAML代码中:
xmlns:fa="http://schemas.fontawesome.io/icons/"
像这样在你的按钮中使用它:
最后在你的C#代码背后:
using FontAwesome.WPF; // on the top of the code btnButton.Content = FontAwesomeIcon.LongArrowRight;