在WPF中,如何防止我的样式被覆盖?
问题描述:
请不要陷入我的例子中,只是为了这个问题忍受我:在WPF中,如何防止我的样式被覆盖?
在我的WPF应用程序中,如果我想让所有文本框都具有“绿色”背景,我会很容易地设置它就像我的Application.Resources一样。
<Style TargetType="TextBox">
<Setter Property="Background" Value="Green" />
</Style>
这工作PERFECTLY ...(谢谢WPF)。但是,如果我在我的应用程序的某个地方有一个TextBox,我想追加更多样式 ...我LOSE我的绿色背景。
例子:
<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不要完全消除所有来自上面的样式,仅仅是因为我有一个简单的,无冲突的,如此细小的样式添加到控件的某处?
答
您可以使用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>
没错,但基本上是像说“你必须重新添加样式到你想覆盖的所有东西“。 :( - 很好的答案,但我讨厌那个解决方案。 – 2009-10-19 14:13:02
我认为它更像一个层叠式的风格。可能有些地方你不想继承你的其他风格覆盖,或者你有不同的样式集 – 2009-10-19 14:45:00
@Timothy,BasedOn属性意味着从指定的类型扩展样式,即使在OOPS中,只要你继承一个类,技术上就是在这个类中的,所以我不介意这种方式。编译级别重新添加基类的所有功能到新类中继承意味着保留/复制所有内容并覆盖某个部分 – 2009-10-19 14:45:05