题
我创建一个WPF应用程序,我想知道能够更改字体大小在用户界面的每一个元素的最佳途径。如何建立一个资源字典,并设置样式设置字体大小为我所用的控制?
什么是最好的做法是什么?
解决方案
我会做这种方式:
<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”的风格,其余的将刚刚从它继承。 (这就是支持算法FMP财产的,你也可以,如果你创建继承风格的内部其他setter方法扩展基本风格)
其他提示
FontSizeProperty从家长控制继承。所以,你只需要改变你的主窗口的字号。
如果您不需要动态行为应该工作:
有关窗口中添加样式到您的ResourceDictionary
<Style TargetType="{x:Type Window}">
<Setter Property="FontSize" Value="15" />
</Style>
应用样式到主表格(不会被施加隐式,因为它的派生类型)
Style = (Style)FindResource(typeof (Window));
另一种选择是,以限定的FontFamily和字号作为资源。
<FontFamily x:Key="BaseFontFamily">Calibri</FontFamily>
<sys:Double x:Key="BaseFontSize">12</sys:Double>
这样,你可以在你的setter方法中使用它们。
<Window>
有一个属性字号。
,以便可以设置在元件所需的字体大小,如果你想改变字体大小在该窗口内所有元素
<Window FontSize="12">
</Window>
Application.Current.MainWindow.FontSize = _appBodyFontSize;
这样,您就可以在运行时也可以更改字体大小。
TextElement.FontSize
是继承属性,这意味着你可以简单地设置在根元素的字体大小,而且所有的子元素将使用该尺寸(只要不改变他们手动地)
有关在WPF任何样式,有你应该包含样式为您的应用程序单独的资源字典。
如果你想有多数民众赞成在整个应用程序重复使用则只需创建该字体大小样式单一的字体大小。您可以给它一个唯一的名称/键明确地使用,也可以设定一个目标类型,将整个应用程序超越。
显式键:
<Style
x:Key="MyFontSize"
TargetType="TextBlock">
<Setter
Property="FontSize"
Value="10" />
</Style>
<Control
Style="{StaticResource MyFontSize}" />
*注意这种风格可以和具有contentPresenters控件一起使用
有关在应用中所有的TextBlocks:
<Style
TargetType="TextBlock">
<Setter
Property="FontSize"
Value="10" />
</Style>
<TextBlock
Text="This text will be size 10" />
如果您需要以编程方式改变全球字号,不是静态(XAML),进行一次对所有Windows应用,你可以这样做:
TextElement.FontSizeProperty.OverrideMetadata(
typeof(TextElement),
new FrameworkPropertyMetadata(16.0));
TextBlock.FontSizeProperty.OverrideMetadata(
typeof(TextBlock),
new FrameworkPropertyMetadata(16.0));
此值被应用于任何的TextBlock,标签和几乎任何文本中的任何窗口,而它具有不限定的明确的字号。但是,这并不对文本框的影响,你必须写一个类似的代码,或其他任何特殊控制。
要动态地与CTRL-滚轮全局改变字体大小:
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;
}
}