【问题标题】:How to set the default font for a WPF application?如何为 WPF 应用程序设置默认字体?
【发布时间】:2011-03-09 21:35:14
【问题描述】:

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

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

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

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

有什么想法吗?

【问题讨论】:

    标签: c# wpf fonts default


    【解决方案1】:

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

    如果您的主窗口名为WinMain(您在所有其他窗口之前加载的窗口),只需添加对名为例如样式的引用。 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>
    

    【讨论】:

    • 乍一看可能不太优雅,在我找到的所有答案中,这是 vs2015+.net framework 4.5.2 的最佳方式。
    • 我觉得这是最优雅的版本。使用热重载功能时,如果使用 Jowen 的答案,则无法热重载。然而,有了这个答案,很容易热重新加载,因为它只是被视为普通样式。
    • 这正是我想要的。谢谢!
    • 漂亮,样式只需要在 App.xaml 中即可。
    【解决方案2】:

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

    将此添加到 App.xaml:

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

    在你的 MainWindow 构造函数中添加这个(在 InitializeComponent 之后):

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

    【讨论】:

      【解决方案3】:

      一种以编程方式进行的简单方法:

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

      【讨论】:

      • 这个对我有用,来自 Rays 的 XAML 答案(让编辑器视图和运行时字体都正确)
      【解决方案4】:

      假设您的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 继承的类型。
      • @Ray:你的 sn-p 肯定不行。因为您必须使用从 Window 派生的类,所以涉及一些额外的代码和/或 xal。
      • @Matze:这非常令人费解,因为我在回答中写的正是我在生产应用程序中使用的代码。我终于弄清楚了为什么它对我有用,但对你没有用,并更新了我的答案以纠正问题。非常感谢您提请我注意。
      • 或在您的 Application 类的受保护的覆盖 void OnStartup(StartupEventArgs e) 内。因为需要创建自己的Main方法来直接调用App的InitializeComponent。感谢您的帮助!
      • 这对我不起作用。我把 Style = (Style)FindResource(typeof(Window)); 放在 InitializeComponent() 调用之后,这对我有用。感谢avolk.parivedasolutions.com/2011/03/…
      【解决方案5】:

      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 派生的。有人知道吗?

      【讨论】:

        【解决方案6】:

        我发现了这个:

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

        【讨论】:

          猜你喜欢
          • 2012-02-01
          • 2021-10-07
          • 1970-01-01
          • 2018-05-21
          • 2018-03-24
          • 2014-02-09
          • 2010-10-30
          • 2011-11-18
          相关资源
          最近更新 更多