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

Rog*_*ueX 71 c# wpf fonts default

我希望能够为我的WPF应用程序定义一个字体系列.优选地使用资源字典作为引用的主题App.xaml.我试过创建Style如下:

<Style TargetType="{x:Type Control}">
    <Setter Property="FontFamily" Value="Segoe UI" />            
</Style>
Run Code Online (Sandbox Code Playgroud)

但这不起作用.将类型设置为TextBlock适用于大多数控件,但有一些控件不适用.

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

有任何想法吗?

Ray*_*rns 56

假设你的Window子类没有覆盖DefaultStyleKey,你只需将它添加到Window样式,因为它TextElement.FontFamilyProperty是一个继承的属性:

<Style TargetType="{x:Type Window}"> 
    <Setter Property="FontFamily" Value="Segoe UI" />             
</Style> 
Run Code Online (Sandbox Code Playgroud)

您还需要在InitializeComponent调用后将以下内容添加到App构造函数中:

FrameworkElement.StyleProperty.OverrideMetadata(typeof(Window), new FrameworkPropertyMetadata
{
    DefaultValue = FindResource(typeof(Window))
});
Run Code Online (Sandbox Code Playgroud)

工作原理:App对象完成初始化后,其中指定的Window样式将成为所有窗口的默认样式.

  • 或者在Application类的受保护的覆盖void OnStartup(StartupEventArgs e)中.因为您需要创建自己的Main方法来直接调用App的InitializeComponent.感谢您的帮助! (2认同)
  • 这不适合我.我把`Style =(Style)FindResource(typeof(Window));`放在InitializeComponent()之后调用,这对我有用.谢谢你http://avolk.parivedasolutions.com/2011/03/default-wpf-application-font.html (2认同)

Jow*_*wen 24

大多数提议的解决方案对我不起作用.我的简单方案:

将其添加到App.xaml:

<Style TargetType="{x:Type Window}">
    <Setter Property="FontSize"
            Value="14" />
</Style>
Run Code Online (Sandbox Code Playgroud)

在MainWindow构造函数中添加它(在InitializeComponent之后):

Style = (Style)FindResource(typeof(Window));
Run Code Online (Sandbox Code Playgroud)


Fra*_* B. 12

实际上,您可以在此处结合其他一些答案获得完整的 XAML 解决方案。

如果您的主窗口被调用WinMain(您在所有其他窗口之前加载的那个),只需添加对名为 eg 的样式的引用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}">
Run Code Online (Sandbox Code Playgroud)

然后以这种方式定义你的风格

<Style x:Key="WinAll" TargetType="{x:Type Window}">
    <Setter Property="FontFamily"
        Value="Comic Sans MS" />
    <Setter Property="FontSize"
        Value="14" />
</Style>
Run Code Online (Sandbox Code Playgroud)

  • 乍一看,它可能看起来不太优雅,但在我找到的所有答案中,这是 vs2015+.net Framework 4.5.2 的最佳方法。 (3认同)
  • 漂亮,样式只需位于 App.xaml 中即可。 (3认同)

Str*_*ong 11

一种以编程方式执行此操作的简单方法:

public MainWindow()
{
    this.FontFamily = new FontFamily("Segoe UI");
}
Run Code Online (Sandbox Code Playgroud)

  • 我不希望它在代码中设置. (2认同)

Ehs*_*adi 7

我找到了这个 :

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

TextBlock.FontFamilyProperty.OverrideMetadata(
typeof(TextBlock),
new FrameworkPropertyMetadata(
    new FontFamily("Comic Sans MS")));
Run Code Online (Sandbox Code Playgroud)