Как включить внешний шрифт в приложение 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, который вам нужен для загрузки файлов.
Пакет с заявкой
- Добавить
/Fonts
папка для вашего решения. - Добавьте шрифты True Type (
*.ttf
) файлы в эту папку - Включить файлы в проект
- Выберите шрифты и добавьте их в решение
Задавать
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>
В
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>
Применяйте ваши шрифты так:
<TextBlock x:Name="myTextBlock" Text="foobar" FontFamily="{StaticResource NotoSans}" FontSize="10.0" FontStyle="Normal" FontWeight="Regular" />
Вы также можете установить шрифт обязательно:
myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/"), "./Fonts/#Noto Sans");
Копировать в выходной каталог
- Добавить
/Fonts
папка для вашего решения. - Добавьте шрифты True Type (
*.ttf
) файлы в этом порядке - Включить файлы в проект
- Выберите шрифты и добавьте их в решение
Задавать
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>
В
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>
Применяйте ваши шрифты так:
<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. Три ноты в конце:
"Катана" - это имя шрифта, а не имя файла. Это существенная разница. Чтобы получить название шрифта, просто дважды щелкните файл.
Не забудьте поставить хеш-знак "#" перед именем шрифта. Это не будет работать иначе.
Пользовательский шрифт также может быть добавлен в проект с "Build Action", установленным в "Content". Однако это не рекомендуемый подход, и ради простоты я проигнорировал эту возможность.
Некоторые дополнительные ссылки
https://msdn.microsoft.com/en-us/library/ms753303(v=vs.100).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="" FontFamily="./assets/fonts/#FontAwesome">
Вам нужно добавить шрифты как элемент ресурса
по ссылке; вы можете добавить желаемый шрифт в качестве файла ресурсов приложения, выполнив следующие действия:
скопируйте файл шрифта в любое место вашего проекта. В большинстве случаев файлы ресурсов копируются в папку с именем "ресурсы", если вы хотите следовать этому, создайте новую папку в своем проекте и назовите ее "ресурсы", затем скопируйте файл шрифта, который является обычно в этой папке есть формат ttf или otf
тогда вам нужно объявить этот файл как файл ресурсов, чтобы у вас было два варианта:
- Щелкните правой кнопкой мыши файл шрифта, выберите свойства (или нажмите F4 после его выбора), а затем измените "Действие сборки" на "Ресурс".
перейдите в каталог ваших проектов
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 включит его в список шрифтов.