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

时间:2010-06-29 23:29:41

标签: c# wpf fonts default

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

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

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

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

有什么想法吗?

6 个答案:

答案 0 :(得分:55)

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

答案 1 :(得分:21)

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

将此添加到App.xaml:

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

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

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

答案 2 :(得分: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")));

答案 3 :(得分:6)

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

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

答案 4 :(得分:3)

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

答案 5 :(得分:-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。有人对此有任何想法吗?