Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF全局字体大小_Wpf_Fonts - Fatal编程技术网

WPF全局字体大小

WPF全局字体大小,wpf,fonts,Wpf,Fonts,我正在创建一个WPF应用程序,我想知道改变ui中每个元素字体大小的最佳方法。我是否创建一个资源字典并设置样式来设置我使用的所有控件的字体大小 Application.Current.MainWindow.FontSize = _appBodyFontSize; 最佳实践是什么?对于WPF中的任何样式,您应该有一个单独的资源字典,其中包含应用程序的样式 Application.Current.MainWindow.FontSize = _appBodyFontSize; 如果你想在整个应用程序

我正在创建一个WPF应用程序,我想知道改变ui中每个元素字体大小的最佳方法。我是否创建一个资源字典并设置样式来设置我使用的所有控件的字体大小

Application.Current.MainWindow.FontSize = _appBodyFontSize;

最佳实践是什么?

对于WPF中的任何样式,您应该有一个单独的资源字典,其中包含应用程序的样式

Application.Current.MainWindow.FontSize = _appBodyFontSize;
如果你想在整个应用程序中重复使用单一字体大小,那么只需为该字体大小创建一个样式即可。您可以为它指定一个唯一的名称/密钥以供显式使用,也可以设置一个将在整个应用程序中超越的targetType

Application.Current.MainWindow.FontSize = _appBodyFontSize;
显式键:

<Style
    x:Key="MyFontSize"
    TargetType="TextBlock">
    <Setter
        Property="FontSize"
        Value="10" />
</Style>

<Control
    Style="{StaticResource MyFontSize}" />
Application.Current.MainWindow.FontSize = _appBodyFontSize;

*注意:此样式可用于具有ContentPresenter的控件

Application.Current.MainWindow.FontSize = _appBodyFontSize;
对于应用程序中的所有文本块:

<Style
    TargetType="TextBlock">
    <Setter
        Property="FontSize"
        Value="10" />
</Style>

<TextBlock
        Text="This text will be size 10" />
Application.Current.MainWindow.FontSize = _appBodyFontSize;

我会这样做:

<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>
Application.Current.MainWindow.FontSize = _appBodyFontSize;


这样,如果我想更改所有控件,我只需要更改“baseStyle”样式,其余的将从它继承。(这就是BasedOn属性,如果在继承的样式内创建其他setter,也可以扩展基础样式)

FontSizeProperty是从父控件继承的。所以您只需要更改主窗口的大小

Application.Current.MainWindow.FontSize = _appBodyFontSize;
如果您不需要动态行为,这应该可以:

Application.Current.MainWindow.FontSize = _appBodyFontSize;
将窗口样式添加到ResourceDictionary

<Style TargetType="{x:Type Window}">
     <Setter Property="FontSize" Value="15" />
</Style>
Application.Current.MainWindow.FontSize = _appBodyFontSize;

如果需要以编程方式更改全局FontSize,而不是静态更改(XAML),以便对所有窗口应用一次,则可以执行以下操作:

TextElement.FontSizeProperty.OverrideMetadata(
            typeof(TextElement),
            new FrameworkPropertyMetadata(16.0));

        TextBlock.FontSizeProperty.OverrideMetadata(
            typeof(TextBlock),
            new FrameworkPropertyMetadata(16.0));
Application.Current.MainWindow.FontSize = _appBodyFontSize;

此值应用于任何窗口中的任何文本块、标签和几乎任何文本,但未定义明确的字体大小。但这并不影响TextBox,您必须为其或任何其他特殊控件编写类似的代码。

另一个选项是将FontFamily和FontSize定义为资源

<FontFamily x:Key="BaseFontFamily">Calibri</FontFamily>
<sys:Double x:Key="BaseFontSize">12</sys:Double>
Application.Current.MainWindow.FontSize = _appBodyFontSize;

Application.Current.MainWindow.FontSize = _appBodyFontSize;
Calibri
12

Application.Current.MainWindow.FontSize = _appBodyFontSize;
这样你就可以在二传中使用它们了

Application.Current.MainWindow.FontSize = _appBodyFontSize;

Application.Current.MainWindow.FontSize = _appBodyFontSize;

Application.Current.MainWindow.FontSize = _appBodyFontSize;

这样,您也可以在运行时更改字体大小。

TextElement.FontSize
是一个继承属性,这意味着您只需在根元素上设置字体大小,所有子元素都将使用该大小(只要您不手动更改它们)

有一个属性FontSize

Application.Current.MainWindow.FontSize = _appBodyFontSize;
因此,如果要更改该窗口中所有元素的fontsize,可以在元素中设置所需的fontsize

Application.Current.MainWindow.FontSize = _appBodyFontSize;
<Window FontSize="12">

</Window>

要使用ctrl鼠标滚轮全局动态更改字体大小:

Application.Current.MainWindow.FontSize = _appBodyFontSize;
XAML:

Application.Current.MainWindow.FontSize = _appBodyFontSize;

代码隐藏:

Application.Current.MainWindow.FontSize = _appBodyFontSize;
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;
    }
}
private void主窗口\u预览鼠标滚轮(对象发送器,鼠标滚轮事件参数)
{
if((Keyboard.Modifiers和ModifierKeys.Control)!=0)
{
如果(e.Delta>0)
++mainCtrl.FontSize;
如果(e.Delta<0&&mainCtrl.FontSize>1)
--mainCtrl.FontSize;
}
}

在XAML中使用资源是一条出路。虽然这个问题有很多很好的答案,但我想在资源的范围内增加我的两分钱

Application.Current.MainWindow.FontSize = _appBodyFontSize;
要在项目的所有窗口和用户控件中实现全局可访问性,您可以将资源放在App.xaml文件中

Application.Current.MainWindow.FontSize = _appBodyFontSize;
<Application.Resources>
    <Style TargetType="{x:Type Control}" x:Key="GlobalFontSize">
        <Setter Property="FontSize" Value="28"/>
    </Style>
</Application.Resources>

对于窗口级别的可访问性,您可以将资源放在窗口的xaml文件中

Application.Current.MainWindow.FontSize = _appBodyFontSize;
<Window.Resources>
    <Style TargetType="{x:Type Control}" x:Key="GlobalFontSize">
        <Setter Property="FontSize" Value="28"/>
    </Style>
</Window.Resources>

例如,您甚至可以在控制级别使用它

Application.Current.MainWindow.FontSize = _appBodyFontSize;
<DockPanel.Resources>
    <Style TargetType="{x:Type Control}" x:Key="GlobalFontSize">
        <Setter Property="FontSize" Value="28"/>
    </Style>
</DockPanel.Resources>

让我们来点黑魔法:

Application.Current.MainWindow.FontSize = _appBodyFontSize;
  • 将双重资源添加到应用程序资源中
  • 通过
    DynamicResource
  • 访问属性
    App.GlobalFontSize
    以任何方式更改值,
    绑定
    都可以
    如果需要动态更改字体大小,请确保在样式和对“baseStyle”的样式引用中都声明为DynamicSource?我尝试过这样做,但出现了以下错误:属性“BaseOn”不支持“DynamicResourceExtension”类型的值。我刚刚将代码从StaticResource更改为DynamicResource。你认为遗漏了什么?忘了那个小问题。我们将所有声明都设置为每个控件声明的setter,这样我们就没有庞大的层次结构。这篇文章很好地解释了这一点。我对这个问题有点好奇,我继续做了一些测试,但似乎一旦设置并使用了StaticResource,就不能修改它了。如果你想在应用程序中的某个时候更改大小,可能需要一个不同的解决方案。@Ian Boyd:但是这个家伙只想更改所有控件的字体大小,而不是控件的大小。你所说的是一个完全不同的问题。这听起来比标记为解决方案的答案更好。我要说的是,在任何情况下,代码都要少得多。编辑:不起作用(在任何情况下,框架4.5)。@KoertvanKleef-它在.NET 4.5上对我有效,你看到了什么问题?为什么要为单个元素创建样式?为什么不直接在元素上执行
    ?这比公认的解决方案更干净、更简单。这最适合我,因为它允许您在运行时使用{DynamicResource}并更改字体大小。必须导入xmlns:sys=“clr namespace:System;assembly=mscorlib”,并且此方法工作得非常好。重要信息:“只要您不手动更改它们“。我花了一些时间才弄清楚字体继承是否有效,因为我手动将其设置为父级。这应该是选定的答案。”@PeterHuber:依赖属性意味着依赖于多个具有某些预定优先级的值提供者。设置本地值具有最高优先级(动画和强制除外)。通过Setter将其应用于窗口不起作用(但在designer视图中看起来是这样的…),但此设置起作用,并且是一个ridi