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


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

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

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

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

有任何想法吗?


63
2018-06-29 23:29


起源




答案:


假设你的 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样式将成为所有窗口的默认样式。


52
2018-06-30 00:41



@Ray:你的代码片段肯定不起作用。因为您必须使用从Window派生的类,所以需要一些额外的代码和/或xal。 - Matze
@Matze:这非常令人费解,因为我在回答中所写的是 究竟 我在生产应用程序中使用的代码。我终于弄清楚为什么它对我有用但不适合你,并更新了我的答案以纠正问题。非常感谢你引起我的注意。 - Ray Burns
或者在Application类的受保护的覆盖void OnStartup(StartupEventArgs e)中。因为您需要创建自己的Main方法来直接调用App的InitializeComponent。感谢您的帮助! - Matze
这种方法对我有用。 - Bryce Kahle
这对我不起作用。我放 Style = (Style)FindResource(typeof(Window)); 就在InitializeComponent()之后调用,这对我有用。谢谢你 avolk.parivedasolutions.com/2011/03/... - user1151923


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

将其添加到App.xaml:

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

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

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

18
2017-11-19 15:46





我找到了这个 :

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

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

7
2017-12-08 15:16



哈哈@漫画sans - David Sherret


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

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

6
2017-10-07 17:06



我不希望它在代码中设置。 - Jowen


实际上,您可以在此处获得完整的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}">

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

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

2
2018-06-06 15:50





尝试这个简单的解决方法 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。有人对此有任何想法吗?


-1
2017-10-26 02:08