如何设置 WPF 应用程序的默认字体?

我希望能够为我的 WPF 应用程序定义一个字体系列。最好使用资源字典作为从 App.xaml引用的主题。我尝试创建一个 Style,如下所示:

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

但这不管用。将类型设置为 TextBlock对大多数控件都适用,但有少数控件不适用。

我知道你可以设置一个窗口的字体,并让该窗口的所有子控件继承该字体。但是我认为任何对话窗口都会回到默认字体,这并不是我想要的。

有什么想法吗?

104571 次浏览

Assuming your Window subclasses don't override DefaultStyleKey, you can simply add it to your Window style, since TextElement.FontFamilyProperty is an inherited property:

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

You also need to add the following to your App constructor after the InitializeComponent call:

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

How it works: After the App object finishes initializing, the Window style specified therein is made the default style for all windows.

I found this :

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


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

Try this simple workaround in the App.xaml (no code behind needed):

<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>

Just bind your windows style to this. Works perfectly for me. Only some properties need to be defined in the nested tree. For example the property FontSize can be specify only in the generic section.

I don't know why is necessary to do this trick. It's strange because Label should be derived from Control. Anyone have any idea about it?

One simple way to do it programmatically:

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

Most of proposed solutions didn't work for me. My simple solution:

Add this to App.xaml:

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

Add this in your MainWindow constructor (after InitializeComponent):

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

Actually you can get a full XAML solution combining some of the other answers here.

If your main window is called WinMain (the one you load before all others), just add a reference to a style named e.g. 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}">

and then define your style this way

<Style x:Key="WinAll" TargetType="{x:Type Window}">
<Setter Property="FontFamily"
Value="Comic Sans MS" />
<Setter Property="FontSize"
Value="14" />
</Style>