Как установить шрифт по умолчанию для приложения WPF? - PullRequest
69 голосов
/ 30 июня 2010

Я хочу иметь возможность определить семейство шрифтов для моего приложения WPF.Предпочтительно использовать словарь ресурсов в качестве темы, на которую ссылается App.xaml.Я попытался создать Style следующим образом:

<Style TargetType="{x:Type Control}">
    <Setter Property="FontFamily" Value="Segoe UI" />            
</Style>

Но это не работает.Установка типа TextBlock работает для большинства элементов управления, но есть несколько элементов управления, к которым это не относится.

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

Есть идеи?

Ответы [ 6 ]

55 голосов
/ 30 июня 2010

Предполагая, что ваши Window подклассы не переопределяют DefaultStyleKey, вы можете просто добавить его в свой стиль Window, поскольку TextElement.FontFamilyProperty является унаследованным свойством:

<Style TargetType="{x:Type Window}"> 
    <Setter Property="FontFamily" Value="Segoe UI" />             
</Style> 

Вам также необходимо добавить следующее в конструктор приложения после вызова InitializeComponent:

FrameworkElement.StyleProperty.OverrideMetadata(typeof(Window), new FrameworkPropertyMetadata
{
    DefaultValue = FindResource(typeof(Window))
});

Как это работает: после завершения инициализации объекта App указанный в нем стиль окна становится стилем по умолчанию для всех окон.

22 голосов
/ 19 ноября 2014

Большинство предложенных решений не работает для меня. Мое простое решение:

Добавить это в App.xaml:

<Style TargetType="{x:Type Window}">
    <Setter Property="FontSize"
            Value="14" />
</Style>

Добавьте это в свой конструктор MainWindow (после InitializeComponent):

Style = (Style)FindResource(typeof(Window));
10 голосов
/ 07 октября 2014

Один простой способ сделать это программно:

public MainWindow()
{
    this.FontFamily = new FontFamily("Segoe UI");
}
7 голосов
/ 08 декабря 2011

Я нашел это:

TextElement.FontFamilyProperty.OverrideMetadata(
typeof(TextElement),
new FrameworkPropertyMetadata(
    new FontFamily("Comic Sans MS")));

TextBlock.FontFamilyProperty.OverrideMetadata(
typeof(TextBlock),
new FrameworkPropertyMetadata(
    new FontFamily("Comic Sans MS")));
2 голосов
/ 06 июня 2018

На самом деле вы можете получить полное решение XAML, сочетающее некоторые другие ответы здесь.

Если ваше главное окно называется WinMain (то, которое вы загружаете раньше всех остальных),просто добавьте ссылку на стиль с именем, например WinAll

<Window x:Class="MyNamespace.WinMain"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="WinMain" Height="450" Width="800"
    Style="{StaticResource WinAll}">

, а затем определите свой стиль следующим образом

<Style x:Key="WinAll" TargetType="{x:Type Window}">
    <Setter Property="FontFamily"
        Value="Comic Sans MS" />
    <Setter Property="FontSize"
        Value="14" />
</Style>
0 голосов
/ 26 октября 2013

Попробуйте этот простой обходной путь в App.xaml (код не требуется):

<SolidColorBrush x:Key="ForeBrush" Color="Blue" />

<Style x:Key="GenericTextStyle">
    <!-- Generic control forecolor definition -->
    <Setter Property="Control.Foreground" Value="{StaticResource ForeBrush}" />

    <!-- Add a definition for each unworking nested control -->
    <Style.Resources>
        <Style TargetType="{x:Type Label}">
            <Setter Property="Foreground" Value="{StaticResource ForeBrush}" />
        </Style>
    </Style.Resources>
</Style>

Просто привяжите к этому свой стиль окон. Отлично работает для меня Только некоторые свойства должны быть определены во вложенном дереве. Например, свойство FontSize можно указать только в общем разделе.

Я не знаю, почему нужно делать этот трюк. Это странно, потому что Label должен быть получен из Control. У кого-нибудь есть идеи по этому поводу?

...