我正在创建WPF应用,我想知道能够更改ui中每个元素的字体大小的最佳方法。我是否创建资源字典并设置样式以设置我使用的所有控件的字体大小?
最佳做法是什么?
Answers:
我会这样:
<Window.Resources>
<Style TargetType="{x:Type Control}" x:Key="baseStyle">
<Setter Property="FontSize" Value="100" />
</Style>
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource baseStyle}"></Style>
<Style TargetType="{x:Type Label}" BasedOn="{StaticResource baseStyle}"></Style>
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource baseStyle}"></Style>
<Style TargetType="{x:Type ListView}" BasedOn="{StaticResource baseStyle}"></Style>
<!-- ComboBox, RadioButton, CheckBox, etc... -->
</Window.Resources>
这样,如果我想更改所有控件,则只需要更改“ baseStyle”样式,其余样式就可以继承。(这就是基于属性的属性,如果您在继承的样式内创建其他设置器,则也可以扩展基本样式)
FontSizeProperty从父控件继承。因此,您只需要更改主窗口的FontSize。
如果您不需要动态行为,则应该可以:
为您的ResourceDictionary添加Window样式
<Style TargetType="{x:Type Window}">
<Setter Property="FontSize" Value="15" />
</Style>
将样式应用于您的主窗体(不会被隐式应用,因为它是派生类型)
Style = (Style)FindResource(typeof (Window));
<Window FontSize="15">
直接在元素上?
<Window>
具有属性FontSize。
因此,如果要更改该窗口中所有元素的字体大小,可以在element中设置所需的字体大小。
<Window FontSize="12">
</Window>
另一个选择是将FontFamily和FontSize定义为资源。
<FontFamily x:Key="BaseFontFamily">Calibri</FontFamily>
<sys:Double x:Key="BaseFontSize">12</sys:Double>
这样,您就可以在设置器中使用它们。
对于WPF中的任何样式,您应该有一个单独的资源字典,其中包含应用程序的样式。
如果您希望单个字体大小在整个应用程序中重复使用,则只需为该字体大小创建样式。您可以为它指定一个唯一的名称/键来显式使用,也可以设置将在整个应用程序中超越的targetType。
显式密钥:
<Style
x:Key="MyFontSize"
TargetType="TextBlock">
<Setter
Property="FontSize"
Value="10" />
</Style>
<Control
Style="{StaticResource MyFontSize}" />
*请注意,此样式可以与具有contentPresenters的控件一起使用
对于应用程序中的所有文本块:
<Style
TargetType="TextBlock">
<Setter
Property="FontSize"
Value="10" />
</Style>
<TextBlock
Text="This text will be size 10" />
FontSizeProperty
。依赖关系属性原则上可以在逻辑树中继承,因此,除非有特殊需要(例如,仅在中间节点上具有不同的字体大小),否则在根元素上设置字体大小就足够了。更新值将触发所有子项的更新。
如果需要以编程方式更改全局FontSize而不是静态(XAML),以对所有窗口都应用一次,则可以执行以下操作:
TextElement.FontSizeProperty.OverrideMetadata(
typeof(TextElement),
new FrameworkPropertyMetadata(16.0));
TextBlock.FontSizeProperty.OverrideMetadata(
typeof(TextBlock),
new FrameworkPropertyMetadata(16.0));
此值可应用于任何TextBlock,Labels以及任何窗口中的几乎所有文本,而尚未定义显式的FontSize。但这对TextBox并没有影响,您必须为其编写类似的代码或任何其他特殊控件。
<Style>
上的a更好TextBlock
,因为否则您将不得不BasedOn
在覆盖它的任何地方使用它!
要使用ctrl-mousewheel动态地全局更改字体大小,请执行以下操作:
XAML:
<Window Name="MainWindow" ... PreviewMouseWheel="MainWindow_PreviewMouseWheel">
后面的代码:
private void MainWindow_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
if ((Keyboard.Modifiers & ModifierKeys.Control) != 0)
{
if (e.Delta > 0)
++mainCtrl.FontSize;
if (e.Delta < 0 && mainCtrl.FontSize > 1)
--mainCtrl.FontSize;
}
}
在XAML中使用资源是必经之路。尽管对于这个问题有很多很好的答案,但是我想在资源范围内加上两美分。
为了在项目的所有Windows和用户控件中具有全局可访问性,您可以将资源放在App.xaml文件中
<Application.Resources>
<Style TargetType="{x:Type Control}" x:Key="GlobalFontSize">
<Setter Property="FontSize" Value="28"/>
</Style>
</Application.Resources>
为了获得Window级别的可访问性,您可以将资源放在Window的xaml文件中
<Window.Resources>
<Style TargetType="{x:Type Control}" x:Key="GlobalFontSize">
<Setter Property="FontSize" Value="28"/>
</Style>
</Window.Resources>
例如,您甚至可以在控制级别使用它
<DockPanel.Resources>
<Style TargetType="{x:Type Control}" x:Key="GlobalFontSize">
<Setter Property="FontSize" Value="28"/>
</Style>
</DockPanel.Resources>
让我们来做一些BLACK MAGIC的事情:
<Application.Resources>
<sys:Double xmlns:sys="clr-namespace:System;assembly=mscorlib" x:Key="GlobalFontSize">12</sys:Double>
</Application.Resources>
public static double GlobalFontSize
{
get => (double)Current.Resources["GlobalFontSize"];
set => Current.Resources["GlobalFontSize"] = value;
}
DynamicResource
FontSize="{DynamicResource GlobalFontSize}"
App.GlobalFontSize
以任何方式访问属性以更改值,binding
都可以!App.GlobalFontSize = 20;
//Or
{Binding Path=(local:App.GlobalFontSize)}