在WPF中,我如何防止我的样式被覆盖?

12
请不要被我的例子所迷惑,只是为了问题的表述,请耐心阅读:
在我的WPF应用程序中,如果我想要所有的文本框都有一个“绿色”背景,我可以很容易地在我的Application.Resources中设置它。
<Style TargetType="TextBox">
 <Setter Property="Background" Value="Green" />
</Style>

这个很好地工作了 完美无缺... (感谢 WPF)。然而,如果我在应用程序中的某个地方有一个文本框,我想要对其进行一些额外的样式设置 ... 那么我将失去我的绿色背景。

示例:

<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>

当鼠标悬停在那个文本框上时,它的前景色会变成红色,但绿色背景完全丢失了。

因此,问题是:我如何告诉WPF不要完全抹掉所有来自上方的样式,仅因为我在某个控件中添加了一个简单的、不冲突的小样式?

1个回答

15

您可以使用Style声明中的"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>

1
真实,但基本上就像是在说“你必须重新添加样式来覆盖所有你想要的东西”。:( - 很好的答案,但我讨厌那个解决方案。 - Timothy Khouri
1
@Timothy,BasedOn属性意味着从指定类型扩展样式,即使在面向对象编程中,当您继承一个类时,在编译级别上,您会将基类的所有功能重新添加到新类中。继承意味着保留/复制所有内容并覆盖某些部分。 - Akash Kava
@Guy - 我希望它是级联的...但它不是。尝试添加更多样式会100%覆盖先前的样式。因此,简要概括一下,它们不会级联(又称追加),而是覆盖(又称替换)。 - Timothy Khouri
1
@Akash - 你的推理听上去不错,但最终关键在于这一点。我是否需要告诉开发团队中的所有15个开发人员,确保在为每个控件添加功能样式时都添加“哦,请别忘记继承!”- 这非常糟糕,而且比它值得的工作量还要多。 - Timothy Khouri
我喜欢你的第一个级联,我一直在寻找这样一个不需要命名基础级联的级联。 - Mohsen Afshin
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接