我正在尝试在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属性的样式,则派生样式的目标类型必须与之相同或派生自基本风格的类型。
答案 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不应该继承红色背景。