2009-10-19 104 views
7

请不要陷入我的例子中,只是为了这个问题忍受我:在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不要完全消除所有来自上面的样式,仅仅是因为我有一个简单的,无冲突的,如此细小的样式添加到控件的某处?

回答

11

您可以使用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> 
+0

没错,但基本上是像说“你必须重新添加样式到你想覆盖的所有东西“。 :( - 很好的答案,但我讨厌那个解决方案。 – 2009-10-19 14:13:02

+0

我认为它更像一个层叠式的风格。可能有些地方你不想继承你的其他风格覆盖,或者你有不同的样式集 – 2009-10-19 14:45:00

+1

@Timothy,BasedOn属性意味着从指定的类型扩展样式,即使在OOPS中,只要你继承一个类,技术上就是在这个类中的,所以我不介意这种方式。编译级别重新添加基类的所有功能到新类中继承意味着保留/复制所有内容并覆盖某个部分 – 2009-10-19 14:45:05