【问题标题】:WPF: disable inheritance of propertiesWPF:禁用属性继承
【发布时间】:2010-03-15 18:03:53
【问题描述】:

我想在我正在开发的应用程序中使用 TabControl 作为主导航。所以我想让 TabItems 标题中的字体更大,并给它另一种背景颜色。但是,我确实希望它被继承。例如, 如果我使用此代码:

<TabControl FontSize="18pt">
  <TabItem Header="Tab 1">
    <Button>Button 1</Button>
  </TabItem>
</TabControl>

按钮中的字体也是 18pt 大。我知道这是正常的依赖属性行为,因为该属性是继承的,但这不是我在这种情况下想要的。我想更改 TabItems 而不更改子项中的任何内容。这不可能吗?因为将所有子项重新设置为默认值是一个 PITA。

感谢您的宝贵时间。

【问题讨论】:

    标签: wpf dependency-properties


    【解决方案1】:

    Header 定义为显式控件(例如TextBlockLabel),您可以在其上应用样式:

    <TabControl FontSize="18pt">
      <TabItem>
        <TabItem.Header>
            <TextBlock Style="{StaticResource tabHeaderStyle}">Tab 1</TextBlock>
        </TabItem.Header>
        <Button>Button 1</Button>
      </TabItem>
    </TabControl>
    

    【讨论】:

    • 这正是我所需要的。我原以为这会更容易一些,但这仍然是我想要的。谢谢!
    【解决方案2】:

    您必须重新考虑一下。您不能只说“不继承”,因为控件必须从某个地方继承其属性值。

    这行得通:

      <TabControl x:Name="Test" FontSize="36">
        <TabControl.Resources>
          <Style TargetType="Button">
            <Setter Property="FontSize" Value="{Binding ElementName=Test, Path=FontSize}"/>
          </Style>        
        </TabControl.Resources>
        <TabItem Header="Test" FontSize="24">
          <Button>Another test</Button>
        </TabItem>
      </TabControl>
    

    【讨论】:

    • “重新思考”是什么意思?我认为我的主张是相当不错的,或者不是?为什么 WPF 不能轻松完成这样一项基本任务? XAML 很酷,但有时我觉得 Microsoft 牺牲了易用性太多了。
    • 我所说的“重新思考”是什么意思:您的问题似乎以按钮具有默认字体大小为前提,并且您想要做的是阻止它继承。但是您几乎可以肯定真正想要的是按钮继续继承其属性,但从其直接父级以外的其他东西继承 - 这样,如果您更改 Window 上的字体大小(例如),按钮的大小也会改变。托马斯的回答是通过(基本上)将选项卡项从继承树中拉出来来实现的。我的回答是通过给按钮一些不同的继承来做到这一点。
    • 谢谢你的解释,你对我理解WPF帮助很大。我想我的问题措辞不好。我只是希望主菜单(tabcontrol)与里面的控件有完全不同的外观。然后继承出现了。所以我试图找到关于“禁用”继承的答案,这显然是错误的方式。再次感谢。
    • 我发现 WPF 的各个方面非常难以准确学习,因为当您的思维模型错误时,就不可能取得进步。我学到的大多数技术都比较宽容;如果你有不明白的地方,你至少可以得到 a 结果,看看你的想法是如何不足的。使用 WPF,东西要么完美无缺,要么根本不工作。
    【解决方案3】:

    每个状态的模板化标头示例: 标题内容的字体属性不会传播到 TabControl 内容中。

    <Style TargetType="{x:Type TabItem}">
        <Setter Property="HeaderTemplate" Value="{DynamicResource TabItemGeneralTemplate.Normal}"/>
                    <Style.Triggers>
                        <Trigger Property="Selector.IsSelected" Value="True">
                            <Setter Property="Background" Value="White"/>
                            <Setter Property="HeaderTemplate" Value="{DynamicResource TabItemGeneralTemplate.Selected}"/>               
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsMouseOver" Value="True"/>
                                <Condition Property="Selector.IsSelected" Value="False"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" Value="White"/>
                            <Setter Property="HeaderTemplate" Value="{DynamicResource TabItemGeneralTemplate.Hover}"/>
                        </MultiTrigger>
                    </Style.Triggers>
            </Style>
    
            ...
    
            <DataTemplate x:Key="TabItemGeneralTemplate.Selected">
               <Label Content="{Binding}" Foreground="#FF343434" FontWeight="Bold"/>
            </DataTemplate>
            <DataTemplate x:Key="TabItemGeneralTemplate.Hover">
               <Label Content="{Binding}" Foreground="{DynamicResource Background.Primary}"/>
            </DataTemplate>
            <DataTemplate x:Key="TabItemGeneralTemplate.Normal">
               <Label Content="{Binding}" Foreground="#FF7C7C7C"/>
            </DataTemplate>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 2020-08-14
      • 2022-01-16
      • 1970-01-01
      • 2014-02-03
      相关资源
      最近更新 更多