Как установить шрифт по умолчанию для приложения WPF?

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

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

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

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

Любые идеи?

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

Style = (Style)FindResource(typeof(Window));

Ответ 3

Я нашел это:

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

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

Ответ 4

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

public MainWindow()
{
    this.FontFamily = new FontFamily("Segoe UI");
}

Ответ 5

Попробуйте это обходное решение в 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>

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

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