自定义控件不继承父级样式

时间:2016-06-10 17:51:28

标签: wpf xaml .net-4.0 custom-controls

我正在尝试在WPF应用程序中保持统一的外观和感觉,同时我想创建一个修改过的TextBox。但是,当我这样做时,我在TextBox的应用程序级别定义的样式不会应用于我创建的类,即使为我的自定义控件创建的样式使用BasedOn属性

是否有一些我遗漏的东西会导致这种情况与我预期的不同?

我使用此设置在VS2010中的全新WPF项目中重现了该问题:

C#代码:

public class CustomTextBox : TextBox
{
    static CustomTextBox() {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomTextBox), new FrameworkPropertyMetadata(typeof(CustomTextBox)));
    }
}

Themes\Generic.xaml中的XAML:

<Style TargetType="{x:Type local:CustomTextBox}" BasedOn="{StaticResource {x:Type TextBox}}"/>

App.xaml中的XAML:

<Application.Resources>
    <Style TargetType="TextBox">
        <Setter Property="Background" Value="Red"/>
    </Style>
</Application.Resources>

但是,在设计器中以及运行应用程序时,CustomTextBox会回退到文本框的默认样式而不是红色背景,即使the documentation for the BasedOn property表明我的派生类应该有这种造型......

  

有几种方法可以扩展或继承WPF中的样式。样式可以通过此属性基于其他样式。使用此属性时,新样式将继承未在新样式中显式重新定义的原始样式的值。

     

...

     

注意:如果您创建具有TargetType属性的样式并将其基于另一个也定义TargetType属性的样式,则派生样式的目标类型必须与之相同或派生自基本风格的类型。

1 个答案:

答案 0 :(得分:1)

简答:您的风格基于StaticResource

<Style TargetType="{x:Type local:CustomTextBox}" BasedOn="{StaticResource {x:Type TextBox}}"/>

执行此操作时,您不会更改StaticResource

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

所以CustomTextBox不应该继承红色背景。