【问题标题】:In WPF, how do I prevent my style from being overridden?在 WPF 中,如何防止我的样式被覆盖?
【发布时间】:2009-10-19 13:38:54
【问题描述】:

请不要陷入我的例子中,为了这个问题,请耐心等待:

在我的 WPF 应用程序中,如果我希望所有 TextBox 都具有“绿色”背景,我可以在我的 Application.Resources 中轻松设置它。

<Style TargetType="TextBox">
 <Setter Property="Background" Value="Green" />
</Style>

这工作完美...(感谢 WPF)。但是,如果我的应用程序中有一个 TextBox,我想添加更多样式到...我失去我的绿色背景。

例子:

<TextBox>
 <TextBox.Style>
  <Style>
   <Style.Triggers>
    <Trigger Property="TextBox.IsMouseOver" Value="True">
     <Setter Property="TextBox.Foreground" Value="Red" />
    </Trigger>
  </Style.Triggers>
  </Style>
 </TextBox.Style>
</TextBox>

当鼠标悬停时,TextBox 将正确地具有红色前景,但绿色背景完全丢失。

所以,问题是:我如何告诉 WPF 不要仅仅因为我在某个地方添加了一个简单的、不冲突的、如此微小的样式而完全清除来自上面的所有样式?

【问题讨论】:

    标签: wpf styling


    【解决方案1】:

    您可以在样式声明中使用“BasedOn”继承已经覆盖的样式。

    在你的第二种风格的声明中,试试这个:

    <TextBox>
     <TextBox.Style>
      <Style BasedOn="{StaticResource {x:Type TextBox}}">
       <Style.Triggers>
        <Trigger Property="TextBox.IsMouseOver" Value="True">
         <Setter Property="TextBox.Foreground" Value="Red" />
        </Trigger>
      </Style.Triggers>
      </Style>
     </TextBox.Style>
    </TextBox>
    

    您也可以将样式基于命名样式,

    <Style x:Key=MyNamedStyle>
    </Style>
    
    <Style BasedOn="{StaticResource MyNamedStyle}" >
    </Style>
    

    【讨论】:

    • 是的,但基本上就像在说“你必须为你想要覆盖的所有东西重新添加样式”。 :( - 很好的答案,但我讨厌那个解决方案。
    • 我认为它更像是一种层叠风格的东西。可能存在您不想继承其他样式覆盖的地方,或者您在不同场景中为相同类型的控件设置不同的样式集。这种方式让你有更多的控制权,所以我不太介意。
    • @Timothy,BasedOn 属性意味着从指定类型扩展样式,即使在 OOPS 中,只要您继承一个类,从技术上讲,在编译级别,您将基类的所有功能重新添加到新类中。继承意味着保留/复制所有内容并覆盖某些部分。
    • @Guy - 如果它是级联的,我会喜欢它......但事实并非如此。尝试添加更多样式 100% 覆盖以前的样式。因此,回顾一下,它们不会级联(又名追加),而是覆盖(又名替换)。
    • @Akash - 你的推理听起来不错,但归根结底是这样。我是否必须告诉我的开发团队中的所有 15 位开发人员,以确保添加“哦,请不要忘记继承!”到他们添加功能样式的每个控件? - 这太可怕了,工作比它的价值还多。
    猜你喜欢
    • 2010-11-14
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 2021-02-08
    • 2020-07-23
    • 2018-06-27
    • 1970-01-01
    相关资源
    最近更新 更多