【问题标题】:Changing Font Icon in WPF using Font Awesome使用 Font Awesome 更改 WPF 中的字体图标
【发布时间】:2014-05-31 06:02:11
【问题描述】:

我正在使用 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:

<Window x:Class="FontAwesomeTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Font Awesome Test Window" Height="300" Width="330" Name="FontAwesomeTestWindow">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="50"/>
        <RowDefinition Height="25"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Button Name="btnGlass" Height="35" Width="85" Click="btnGlass_Click" >Glass</Button>
    <Button Name="btnMusic" Grid.Column="1" Height="35" Width="85" Click="btnMusic_Click">Music</Button>
    <Button Name="btnSearch" Grid.Column="2" Width="85" Height="35"  Click="btnSearch_Click">Search</Button>
    <TextBlock Grid.Row="1" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="18" FontFamily="../Resources/#FontAwesome">&#xf000;</TextBlock>
    <TextBlock Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="18" FontFamily="../Resources/#FontAwesome">&#xf001;</TextBlock>
    <TextBlock Grid.Row="1" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="18" FontFamily="../Resources/#FontAwesome">&#xf002;</TextBlock>
    <TextBlock Name="tblkFontIcon" Grid.Row="2" Grid.ColumnSpan="3" FontSize="64" FontFamily="../Resources/#FontAwesome" HorizontalAlignment="Center" VerticalAlignment="Center">&#xf011;</TextBlock>
</Grid>

我使用以下教程将 Font Awesome 合并到我的应用程序 http://www.codeproject.com/Tips/634540/Using-Font-Icons

所以本质上,我怎样才能更改图标但有图标显示 - 而不是 Unicode?​​p>

提前致谢。

【问题讨论】:

标签: c# wpf xaml fonts font-awesome


【解决方案1】:

Font Awesome 具有名为 FontAwesome.UWPFontAwesome.WPF 的 NuGet 包。只需下载其中一个。

如果您将使用图标导入跟随命名空间到您的 XAML 代码中:

xmlns:fa="http://schemas.fontawesome.io/icons/"

像这样在你的按钮中使用它:

<Button x:Name="btnButton">
    <Button.Content>
        <fa:ImageAwesome Icon="LongArrowLeft"/>
    </Button.Content>
</Button>

最后在你的 C# 代码后面:

using FontAwesome.WPF; // on the top of the code
btnButton.Content = FontAwesomeIcon.LongArrowRight;

【讨论】:

  • 这是一个非常好的方式,它使使用 fontawesome 变得很方便。
  • 对于同一个 XAML,我不得不在后面使用以下代码:(btnButton.Content as ImageAwesome).Icon = FontAwesomeIcon.LongArrowRight;
  • 谢谢,非常有帮助的步骤。所有其他帖子遗漏的是“如果您将使用图标导入跟随命名空间到您的 XAML 代码中:”。否则您的标记将无法构建/编译。
  • 使用这个包时如何设置图片来源?
  • @paul 你是什么意思?这是一个图标字体。
【解决方案2】:

更新

我发现了一个关于这个主题的不同帖子—— Add Icon font in wpf 我认为这应该更符合您的要求。

确保将您的字体添加为资源。然后,使用以下 字符串:

<Setter Property="TextElement.FontFamily" Value="pack://application:,,,/fonts/#FontAwesome" />

在上面的字符串中,我假设字体的名称(不是 字体的文件名)是 FontAwesome。

你只需要:

  1. 将字体添加到您的项目中,假设您将它们放入“字体”文件夹中
  2. 将 Build Action 更改为 Resource not Embedded Resource
  3. 添加您的样式以设置字体系列,如上面的代码片段,并将TextBlock.Text 设置为您喜欢的图标并将样式应用于 TextBlock。

如果您想通过更新TextBlock.Text 属性来更改图标,您应该使用支持的Unicode 字符串设置Text 属性。

试试类似的东西

 tblkFontIcon.Text = "\uf000";

而不是

tblkFontIcon.Text = "&#xf000;";

如果您使用的是来自Using Font Icons 的代码

那么您可能错过了该帖子中的“工作原理”部分。 您应该使用该标记扩展,而不是使用 TextBlock.Text 属性。

在他的示例代码中:

<RibbonButton Label="Import data" 
  LargeImageSource="{WpfTools:ImageFromFont Text=&#xf01a;, 
  FontFamily=/RibbonFontIconSample;component/Resources/#FontAwesome, Brush=Brown}" />

注意WpfTools:ImageFromFont,它是Markup Extention,它允许xaml解析器转换

{WpfTools:ImageFromFont Text=&#xf01a;, 
      FontFamily=/RibbonFontIconSample;component/Resources/#FontAwesome, Brush=Brown}

分配给ImageSource 并分配给LargeImageSource 属性。

因此,在您的 xaml 中,您可以将 TextBlock 替换为 Image,那么它应该类似于:

<Image Source="{WpfTools:ImageFromFont Text=&#xf000;, 
      FontFamily=/RibbonFontIconSample;component/Resources/#FontAwesome, Brush=Brown}" />

如果要更改图标,则必须自己更改ImageSource,只需按照Using Font Icons 创建自己的方法,或者只需复制该教程中的以下代码即可。

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;
}

【讨论】:

  • 首先 - 感谢您的快速响应!您提供的更新是我目前在我的 WPF 应用程序中使用字体的方式。正如问题所述,它当前有效,但在我更改 Text 属性时显示 Unicode,即使我将其更改为相同的 Unicode。我试图包含此图像,但没有足够的“街头信誉”。至于使用字体图标部分,我不知道如何根据需要在运行时使用它来更改图标。我可以在设计/构建期间让它工作。
  • 我认为您应该使用 unicode 字符串设置文本,而不是使用“”。
  • 我已经更新了,您可以按照该代码将您的 TextBlock.Text 更改为另一个 unicode 字符串,这应该可以工作。
  • 因为“”是一个 xaml“版本”unicode,xaml 解析器将其转换为相应的 unicode 字符串,即 c# 中的“\uf000”,并将其设置为tblkFontIcon.Text
【解决方案3】:

简单易行:

你应该在你的系统上安装fontawesome字体,如下使用它

<Button Content="&#xf0e4;" FontFamily="FontAwesome" FontSize="32" />

如何编写图标,{}{FontAwesome 图标代码} 例如  用于通讯录

要查找代码列表,请转到 FontAwesomeastronaut web

【讨论】:

    猜你喜欢
    • 2019-02-24
    • 2016-11-13
    • 2023-03-23
    • 2017-07-13
    • 2017-09-10
    • 2017-05-19
    • 2016-11-05
    • 1970-01-01
    • 2015-06-01
    相关资源
    最近更新 更多