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

Как включить внешний шрифт в приложение 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 Application, но не в WPF.

9 ответов

Решение

Я использую такой код 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>

Это два способа сделать это. Одним из способов является упаковка шрифтов внутри приложения. Другой способ заключается в том, чтобы иметь шрифты выходной папки отдельно. Разница в основном в 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. В App.xaml добавлять <FontFamily> Ресурсы. Это должно выглядеть как в следующем примере кода. Обратите внимание, что 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. В App.xaml добавлять <FontFamily> Ресурсы. Это должно выглядеть как в следующем примере кода. Обратите внимание, что 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" />
    

Рекомендации

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

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. "Катана" - это имя шрифта, а не имя файла. Это существенная разница. Чтобы получить название шрифта, просто дважды щелкните файл.

  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

Самый простой способ включить внешние шрифты - это

Шаг 1. Создайте папкуFonts И добавьте в него свои шрифты.

Шаг 2. Установите действие сборки наcontent и скопировать в выходной каталог в Copy always.

Шаг 3. Создайте решение, чтобы обновить его с помощью каталога шрифтов.

Шаг 4. Используйте шрифт в своих элементах, используяFontFamily="Fonts/#font name"

Все сделано!

Спасибо cscience!

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

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

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

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

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

Во-первых) Скопируйте шрифты в папку проекта, как /Resources/Fonts/ и установите свойства шрифта -> Build Action:Resource

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

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

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

<Window

 FontFamily ="./Fonts/#somefont"

>

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

Хотя решение от @movgp0 сначала работало, оно не помогло, когда мне понадобился полужирный текст. Путем поиска в Интернете я нашел следующее решение, которое работает во всех случаях:

<Application.Resources>
  <FontFamily x:Key="FiraSansBold">Fonts/FiraSansCondensed-Bold.ttf#Fira Sans Condensed</FontFamily>
  <FontFamily x:Key="FiraSansBoldItalic">Fonts/FiraSansCondensed-BoldItalic.ttf#Fira Sans Condensed</FontFamily>
  <FontFamily x:Key="FiraSansItalic">Fonts/FiraSansCondensed-Italic.ttf#Fira Sans Condensed</FontFamily>
  <FontFamily x:Key="FiraSans">Fonts/FiraSansCondensed-Regular.ttf#Fira Sans Condensed</FontFamily>
</Application.Resources>

Применение: <Label FontFamily="{StaticResource FiraSansBold}">SomeBoldedLabel</Label>

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

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

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

    ...
}

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

<Button Content="&#xf0c9;" FontFamily="./assets/fonts/#FontAwesome">

Вам нужно добавить шрифты как элемент ресурса

по ссылке; вы можете добавить желаемый шрифт в качестве файла ресурсов приложения, выполнив следующие действия:

  1. скопируйте файл шрифта в любое место вашего проекта. В большинстве случаев файлы ресурсов копируются в папку с именем "ресурсы", если вы хотите следовать этому, создайте новую папку в своем проекте и назовите ее "ресурсы", затем скопируйте файл шрифта, который является обычно в этой папке есть формат ttf или otf

  2. тогда вам нужно объявить этот файл как файл ресурсов, чтобы у вас было два варианта:

    1. Щелкните правой кнопкой мыши файл шрифта, выберите свойства (или нажмите F4 после его выбора), а затем измените "Действие сборки" на "Ресурс".
    2. перейдите в каталог ваших проектов project-name.csproj файл и следующий тег:

      <ItemGroup>            
          <Resource Include="resources\<font-file-name>.ttf" />  
      </ItemGroup>```
      

наконец, в своем приложении вы можете установить свойство font-family следующим образом:

FontFamily="./Resources/Fonts/#<font-name>"

будьте осторожны 'font-name' отличается от font-file-name, вы можете открыть файл шрифта и проверить свойство имени шрифта (в Microsoft Window)

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

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

Вроде, действительно просто:

<TextBlock x:Name="lblTitle" FontSize="24" Margin="256,25,178,289" Text="gg" FontFamily="/FontTest;component/#Arvo"></TextBlock>

Когда вы импортируете шрифт, vs включит его в список шрифтов.

Другие вопросы по тегам