Как включить внешний шрифт в приложение WPF без его установки - PullRequest
39 голосов
/ 23 июня 2011

Как включить внешний шрифт в приложение WPF без его установки

Я попробовал этот код

  System.Drawing.Text.PrivateFontCollection privateFonts = new    System.Drawing.Text.PrivateFontCollection();
  privateFonts.AddFontFile("C:\\Documents and Settings\\somefont.ttf");
  System.Drawing.Font font = new Font(privateFonts.Families[0], 12);
  this.label1.Font = font;

Он работает правильно в приложении Windows Form, но не в WPF.

Ответы [ 9 ]

84 голосов
/ 07 октября 2016

Это два способа сделать это.Одним из способов является упаковка шрифтов внутри приложения.Другой способ заключается в том, чтобы иметь шрифты выходной папки отдельно.Разница в основном в URI, который вам нужен для загрузки файлов.

Пакет с приложением

  1. Добавьте папку /Fonts в свое решение.
  2. Добавление файлов шрифтов True Type (*.ttf) в эту папку
  3. Включение файлов в проект
  4. Выбор шрифтов и добавление их в решение
  5. Набор BuildAction: Resource и Copy To Output Directory: Do not copy.Ваш файл .csproj должен теперь иметь следующий раздел:

     <ItemGroup>
      <Resource Include="Fonts\NotoSans-Bold.ttf" />
      <Resource Include="Fonts\NotoSans-BoldItalic.ttf" />
      <Resource Include="Fonts\NotoSans-Italic.ttf" />
      <Resource Include="Fonts\NotoSans-Regular.ttf" />
      <Resource Include="Fonts\NotoSansSymbols-Regular.ttf" />
    </ItemGroup>
    
  6. In App.xaml add <FontFamily> Resources.Это должно выглядеть как в следующем примере кода.Обратите внимание, что URI не содержит имя файла при упаковке с приложением.

    <Applicaton ...>
    <Application.Resources>
        <FontFamily x:Key="NotoSans">pack://application:,,,/Fonts/#Noto Sans</FontFamily>
        <FontFamily x:Key="NotoSansSymbols">pack://application:,,,/Fonts/#Noto Sans Symbols</FontFamily>
    </Application.Resources>
    </Application>
    
  7. Примените ваши шрифты следующим образом:

    <TextBlock x:Name="myTextBlock" Text="foobar" FontFamily="{StaticResource NotoSans}" 
               FontSize="10.0" FontStyle="Normal" FontWeight="Regular" />
    
  8. Вы также можете установить шрифт обязательно:

    myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/"), "./Fonts/#Noto Sans");
    

Копировать в выходной каталог

  1. Добавить папку /Fonts в свое решение.
  2. Добавьте файлы шрифтов True Type (*.ttf) к этому порядку
  3. Включите файлы в проект
  4. Выберите шрифты и добавьте их в решение
  5. Набор BuildAction: Content и Copy To Output Directory: Copy if newer.Ваш файл .csproj должен теперь иметь следующий раздел:

     <ItemGroup>
      <Content Include="Fonts\NotoSans-Bold.ttf">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
      <Content Include="Fonts\NotoSans-BoldItalic.ttf">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
      <Content Include="Fonts\NotoSans-Italic.ttf">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
      <Content Include="Fonts\NotoSans-Regular.ttf">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
      <Content Include="Fonts\NotoSansSymbols-Regular.ttf">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
    </ItemGroup>
    
  6. In App.xaml add <FontFamily> Resources.Это должно выглядеть как в следующем примере кода.Обратите внимание, что URI не содержит имя файла при упаковке с приложением.

    <Applicaton ...>
    <Application.Resources>
        <FontFamily x:Key="NotoSansRegular">./Fonts/NotoSans-Regular.tts#Noto Sans</FontFamily>
        <FontFamily x:Key="NotoSansItalic">./Fonts/NotoSans-Italic.tts#Noto Sans</FontFamily>
        <FontFamily x:Key="NotoSansBold">./Fonts/NotoSans-Bold.tts#Noto Sans</FontFamily>
        <FontFamily x:Key="NotoSansBoldItalic">./Fonts/NotoSans-BoldItalic.tts#Noto Sans</FontFamily>
        <FontFamily x:Key="NotoSansSymbols">./Fonts/NotoSans-Regular.tts#Noto Sans Symbols</FontFamily>
    </Application.Resources>
    </Application>
    
  7. Примените ваши шрифты следующим образом:

    <TextBlock Text="foobar" FontFamily="{StaticResource NotoSansRegular}" 
               FontSize="10.0" FontStyle="Normal" FontWeight="Regular" />
    

Ссылки

24 голосов
/ 28 июля 2011

Я использую такой код XAML:

<Style x:Key="Hatten">
        <Setter Property="TextElement.FontFamily" Value="Resources/#HATTEN" />
</Style>

# HATTEN - ссылка на hatten.tft в Ресурсах.

Использование стиля:

 <TextBlock x:Name="lblTitle" Style="{DynamicResource Hatten}" FontSize="72"></TextBlock>
15 голосов
/ 17 мая 2016

Лучший ответ на этот вопрос я нашел здесь

http://geekswithblogs.net/Martinez/archive/2010/01/29/custom-font-in-wpf-application.aspx

РЕШЕНИЕ Он включает в себя использование еще более злой строки, чем раньше, но работает как ожидалось:

<Label FontFamily="pack://application:,,,/Folder1/#Katana">Text</Label> 

Где находится Folder1 - это папка вашего проекта, в которой вы храните файл TTF. Три ноты в конце:

  1. ‘Katana’ - это имя шрифта, а не имя файла. Это существенная разница. Чтобы получить название шрифта, просто дважды щелкните файл.

  2. Не забудьте поставить хеш-знак ‘#’ перед именем шрифта. Иначе работать не будет.

  3. Пользовательский шрифт также может быть добавлен в проект с «Build Action», установленным в «Content». Однако это не рекомендуемый подход, и ради простоты я проигнорировал эту возможность.

Некоторые дополнительные ссылки

https://msdn.microsoft.com/en-us/library/ms753303(v=vs.100).aspx

https://msdn.microsoft.com/en-us/library/cc296385.aspx

5 голосов
/ 26 марта 2014

Я не нашел никакого ответа именно для этого. Но я нашел решение, которое не увидел в интернете.

Я последовал рекомендации сделать папку и пометить все файлы внутри как Ресурсы. Но мне нужно было перечислить их, и это было моей главной проблемой, потому что мне нужно было загрузить все на мой экран, не записав где-нибудь имя. Я просто хочу добавить другой шрифт в эту папку и перечислить его.

Я нашел это решением для перечисления всех файлов в моей папке resources / fonts

Fonts.GetFontFamilies(new Uri("pack://application:,,,/resources/fonts/#"))

Я ожидаю, что это поможет вам организовать ваши шрифты.

4 голосов
/ 06 января 2014

Я использую xaml для этого

<Window

 FontFamily ="./Fonts/#somefont"

>

Я включил файл шрифта в папку "Fonts"

2 голосов
/ 05 августа 2016

У меня есть папка шрифтов внутри папки ресурсов в моем проекте.Во время сборки он скопирует эти шрифты в папку как контент.Затем я могу просто использовать следующий XAML, чтобы использовать шрифт FontAwesome, чтобы на моей кнопке был значок.

<Button Content="&#xf0c9;" FontFamily="./assets/fonts/#FontAwesome">
1 голос
/ 06 октября 2017

Вот что сработало для меня:

(1) Добавить каталог в проект: font

(2) Переместить файл шрифта ttf в каталог шрифтов

(3) ДобавитьФайл шрифта ttf для проекта

(4) Установите для свойства «Build» файла шрифта tff значение «Resource» (Примечание. В поле со списком я использовал «Resource» вместо «Embedded Resource».)

(5) Откройте окно, в котором вы используете шрифт, и внесите следующие изменения:

<Window ... >
    <Window.Resources>
        <FontFamily x:Key="YourFontNickName">
        pack://application:,,,/font/#NameOfFont
        <!-- Note: NameOfFont can be font by double clicking
             on font from explorer and writing down name
             of the font reported.  Its not the same
             as the file name -->
        </FontFamily>   
    </Window.Resources>


    <!-- Use font as Xaml -->
    <StackPanel>
        <Textblock FontFamily="{StaticResource YourFontNickName}">
        This is a test
        </Testblock>
        <Textblock Name="text1"/>
    </StackPanel>
...
</Window>

(6) Если вы хотите изменить шрифт из кода.Сделайте это:

public partial class Window1 : Window {

    // Use font as C# Code
    public void UpdateText1() {

            text1.Text      = "Hi There";
            FontFamily ff   = this.Resources["YourFontNickName"] 
                                as FontFamily;
            if (ff == null) {
                Messagebox.Show("Wrong Font Name", "ERROR");
                return;
            }
            text1.FontFamily = ff;
            text1.FontSize   = 30;
    }

    ...
}
0 голосов
/ 10 октября 2018

Первый) Скопируйте шрифты в папку проекта, например /Resources/Fonts/ и установите свойства шрифта -> Действие сборки: Ресурс

Второй) Используется для кода

FontFamily="/AssemblyNamespace;component/Resources/Fonts/IranSans/#IRANSansWeb Medium"

enter image description here

0 голосов
/ 09 октября 2017

Я пытался заставить это работать также с другим шрифтом, у меня это работало только в этом формате с ./Fonts

<FontFamily x:Key="NotoSans">pack://application:,,,./Fonts/#Noto Sans</FontFamily>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...