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


76

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

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

但这是行不通的。将类型设置为TextBlock适用于大多数控件,但是有一些控件不适用于该控件。

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

有任何想法吗?

Answers:


59

假设您的Window子类没有覆盖DefaultStyleKey,您可以简单地将其添加到Window样式中,因为TextElement.FontFamilyProperty它是继承的属性:

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

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

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

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


这不起作用,因为样式不适用于从Window继承的类型。
Matze 2010年

1
@Ray:您的代码段绝对无效。因为您必须使用从Window派生的类,所以涉及一些其他代码和/或xal。
Matze 2010年

1
@Matze:这很令人困惑,因为我在答案中写的正是我在生产应用程序中使用的代码。我终于弄清楚了为什么它对我有用,但对您不起作用,并更新了我的答案以纠正问题。非常感谢您引起我的注意。
Ray Burns)2010年

2
或在您的Application类的受保护重写void OnStartup(StartupEventArgs e)内部。因为您需要创建自己的Main方法来直接调用App的InitializeComponent。多谢您的协助!
Matze 2010年

2
这对我不起作用。我把它放在Style = (Style)FindResource(typeof(Window));InitializeComponent()调用之后,它对我有用。由于去avolk.parivedasolutions.com/2011/03/...
user1151923

26

大多数建议的解决方案都不适合我。我的简单解决方案:

将此添加到App.xaml:

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

将其添加到您的MainWindow构造函数中(在InitializeComponent之后):

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

12

一种简单的编程方式:

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

这对我
有用

8

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

3
乍一看,它可能看起来并不优雅,这是vs2015 + .net framework 4.5.2的最佳方法,在我发现的所有答案中。
Val

1
我发现这是最优雅的版本。使用热重载功能时,如果使用了Jowen的答案,则无法热重载。但是,有了这个答案,就很容易进行热重装,因为它只是被视为一种普通样式。
darophi

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")));

-1

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派生。有人对此有想法吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.