【发布时间】:2012-07-20 14:34:58
【问题描述】:
在我的项目中,文本框有一个自定义样式。定义为:
<Style TargetType="TextBox"/>
所以它默认应用于所有文本框子控件。
我需要创建另一种基于默认样式的样式。但是如何在 BasedOn 属性中指定我的新样式应该使用默认样式?
【问题讨论】:
在我的项目中,文本框有一个自定义样式。定义为:
<Style TargetType="TextBox"/>
所以它默认应用于所有文本框子控件。
我需要创建另一种基于默认样式的样式。但是如何在 BasedOn 属性中指定我的新样式应该使用默认样式?
【问题讨论】:
使用你想扩展的控件类型
BasedOn="{StaticResource {x:Type TextBox}}"
完整示例:
<Style x:Key="NamedStyle" TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
<Setter property="Opacity" value="0.5" />
</Style>
【讨论】:
MyButton : Button,该怎么办? x:Type 在这里会有所帮助,但现在,我假设它必须在自定义类的代码隐藏中完成?
this.DefaultStyleKey = typeof(Button); 然后可以按照通常的方式定义样式。我试试看。
@Aphelion 有正确答案。我想补充一下ResourceDictionary事项中定义项目的顺序。
如果你覆盖了一个滑块的默认样式,并且你想要基于它的另一个滑块样式,你必须在覆盖样式之后声明“基于”滑块。
例如,如果你这样做:
<Style x:Key="BlueSlider" TargetType="{x:Type Slider}" BasedOn="{StaticResource {x:Type Slider}}">
<Setter Property="Background" Value="Blue"/>
</Style>
<Style TargetType="{x:Type Slider}">
<Setter Property="Foreground" Value="Yellow"/>
</Style>
BlueSlider 将具有蓝色背景和默认(白色)前景。
但如果你这样做:
<Style TargetType="{x:Type Slider}">
<Setter Property="Foreground" Value="Yellow"/>
</Style>
<Style x:Key="BlueSlider" TargetType="{x:Type Slider}" BasedOn="{StaticResource {x:Type Slider}}">
<Setter Property="Background" Value="Blue"/>
</Style>
BlueSlider 将具有蓝色背景和黄色前景。
【讨论】: