Изменение значка шрифта в WPF с использованием шрифта Awesome

Я использую иконки Font Awesome для рендеринга основных изображений шрифтов в моем приложении С# WPF. Во время выполнения, когда я пытаюсь изменить TextBlock для отображения другого значка шрифта, но вместо значка шрифта отображается представление Unicode.

Я создал образец приложения для отображения этого. При нажатии любой из кнопок свойство TextBlock Text заменяется на кодировку Unicode для соответствующего значка. В проекте есть папка "Ресурсы", в которой файл шрифта FontAwesome.ttf используется в качестве ресурса сборки, на который ссылается свойство TextBlock FontFamily.

Вот мой пример исходного кода приложения:

Code-Behind:

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

Итак, по сути, как я могу изменить иконку, но у меня есть иконка, а не юникод?

Заранее спасибо.

Ответ 1

ОБНОВИТЬ

Я нашел другое сообщение для этой темы - Добавить значок шрифта в wpf Я думаю, что это будет более вероятно, что вы хотите.

Убедитесь, что ваш шрифт добавлен в качестве ресурса. Затем используйте следующую строку:

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

В приведенной выше строке я предполагаю, что имя шрифта (а не имя файла шрифта) - FontAwesome.

Вам просто нужно:

  1. Добавьте шрифт в свой проект, скажем, вы поместили их в папку "Шрифты",
  2. Изменение действия сборки для ресурса, а не встроенного ресурса
  3. Добавьте свой стиль, чтобы установить семейство шрифтов, например, снимок кода выше, и установите TextBlock.Text на понравившемся значке и примените стиль к TextBlock.

Если вы хотите изменить значок, обновив свойство TextBlock.Text, вы должны установить свойство Text с поддерживаемой строкой unicode.

Попробуйте что-нибудь вроде

 tblkFontIcon.Text = "\uf000";

скорее, чем

tblkFontIcon.Text = "&#xf000;";

Если вы используете код из " Использование значков шрифтов"

то вы, вероятно, пропустили раздел "Как это работает" в этом сообщении. Вы должны использовать это расширение разметки, а не использовать свойство TextBlock.Text.

В своем примере кода:

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

обратите внимание на WpfTools:ImageFromFont, это расширение разметки, оно позволяет анализатору 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, просто следуйте 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;
}

Ответ 2

Font Awesome имеет пакеты NuGet с именами FontAwesome.UWP и FontAwesome.WPF. Просто скачайте одно из этого.

NuGet Packages for Font Awesome

Если вы будете использовать импорт значков, следуйте за пространством имен в свой код XAML:

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

Используйте его в свою кнопку следующим образом:

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

И, наконец, в вашем коде С#:

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

Ответ 3

Просто и очень легко:

Вы должны установить шрифт Fontawesome в вашей системе, используйте его следующим образом

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

Как создать значок, {& # x} {FontAwesome icon code}, например, & # xf2b9 для адресной книги

Чтобы найти список кодов, перейдите в FontAwesome или в сеть астронавтов.