我希望能够为我的WPF应用程序定义一个字体系列。优选地使用资源字典作为从App.xaml
引用的主题。我尝试按如下方式创建Style
:
<Style TargetType="{x:Type Control}">
<Setter Property="FontFamily" Value="Segoe UI" />
</Style>
但这不起作用。将类型设置为TextBlock
适用于大多数控件,但有一些控件不适用。
我知道您可以在窗口上设置字体,并让该窗口的所有子控件继承该字体。但我认为任何对话框窗口都会回到默认字体,这不是我想要的。
有什么想法吗?
答案 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。有人对此有任何想法吗?