【问题标题】:The ability to propagate default values down the element tree doesn't work将默认值沿元素树传播的能力不起作用
【发布时间】:2019-12-03 17:29:58
【问题描述】:

在我的简单应用程序窗口中尝试为其上的所有控件设置字体大小时,我遇到了一个奇怪的问题。一些控件从父窗口继承字体大小,而另一些(菜单、状态栏)则没有。 我希望为窗口设置 FontSize 属性值将沿元素树向下传播。但是对于某些控件,它不起作用。

为什么?对此有什么解释吗?我的代码有错误吗?

注意:后面没有代码。

MainWindow.xaml

<Window x:Class="WpfApp.MainWindow"
        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"
        xmlns:local="clr-namespace:WpfApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="340" Width="300"
        FontSize="24" >

    <StackPanel>
        <Label Content="Hello! " />
        <Menu DockPanel.Dock="Top" Margin="10">
            <MenuItem Header="File"/>
            <MenuItem Header="Edit"/>
            <MenuItem Header="View"/>
            <MenuItem Header="Help"/>
        </Menu>
        <ListBox Margin="10">
            <ListBoxItem>Chapter 1</ListBoxItem>
            <ListBoxItem>Chapter 2</ListBoxItem>
        </ListBox>
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
            <Button Margin="5" Padding="5" Content="Help"/>
            <Button Margin="5" Padding="5" Content="OK" />
        </StackPanel>
        <StatusBar Margin="10">
            <Label>Status Bar</Label>
            <Separator/>
            <Label>Zoom</Label>
            <ComboBox SelectedIndex="0">
                <ComboBoxItem>100%</ComboBoxItem>
                <ComboBoxItem>75%</ComboBoxItem>
                <ComboBoxItem>50%</ComboBoxItem>
                <ComboBoxItem>25%</ComboBoxItem>
            </ComboBox>
        </StatusBar>
    </StackPanel>
</Window>

上图下方的菜单和状态栏都没有继承 字体大小:

【问题讨论】:

  • 这能回答你的问题吗? WPF global font size
  • @Pavel Anikhouski - 实际上,不是。我知道这种方法。但是我想明白为什么父母设置了一个属性,而一个拥有相同属性的孩子却没有继承它,尽管它没有重新定义它。我宁愿不要创建一百个新样式,而是使用现有的 WPF 机制来继承属性。

标签: c# wpf


【解决方案1】:

一些 WPF 控件,如 MenuStatusBar,将 FontSize 属性显式设置为其默认样式。

Menu.xaml

<Style x:Key="{x:Type Menu}" TargetType="{x:Type Menu}">
    ...
    <Setter Property="FontSize"
        Value="{DynamicResource {x:Static SystemFonts.MenuFontSizeKey}}"/>
    ...
</Style>

这就是继承中断的原因。

如果一个属性被显式设置,它将不会继承一个值。

解决此问题的唯一方法是覆盖默认样式。

【讨论】:

  • 这是有道理的。更改定义类型的样式的缺点是它会触及所有元素树。我只想更改元素树的一部分属性。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多