在WPF中设置自定义控件的隐式样式
我的自定义控件的默认样式在Generic.xaml中定义,并且工作正常。在WPF中设置自定义控件的隐式样式
但是,当我尝试改变我的自定义控件的样式时,就像使用内置控件时一样,没有任何反应。在App.xaml中我试图通过以下操作来改变我的控制的默认样式:
<Style TargetType="{x:Type my:CustomControl}">
<Setter Property="Background" Value="Red"/>
</Style>
如果我设置x:上述风格和参考的关键属性使用该密钥的所有工作正常,这种风格。
上述造型方法仅适用于内置控件,不适用于自定义控件,或者我只是做错了什么?是否有一个可行的解决方案来实现这种自定义控件的样式?
更新 在这种情况下,我的自定义控件是从System.Windows.Window派生的。
我终于设法让我的自定义控件工作的隐式样式。显然隐式样式可能不适用于派生控件,因为样式不会自动应用于控件。为了实现这个,必须手动设置资源引用。我的自定义控件现在看起来是这样的:
public class CustomControl : Window
{
static CustomControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl), new FrameworkPropertyMetadata(typeof(CustomControl)));
}
public CustomControl()
{
SetResourceReference(StyleProperty, typeof(CustomControl));
}
}
是的,你是对的。 Generic.xaml
用于自定义控件,App.xaml
用于应用程序范围的资源(包括内置控件的样式)。对于App.xaml
中的自定义控件指定TargetType
将不起作用。所以使用明确的样式(与x:Key
)似乎是最简单的解决方案。
这显然是错误的。您当然可以在Generic.xaml中(通常在控件库程序集中)使用默认控件样式,而在App.xaml中使用另一个默认样式。后者将自动基于前者。 – Clemens
你在静态构造函数设置DefaultStyleKeyProperty.OverrideMetadata或你正在做一些解决方法吗? – shadow32
“上述造型方法仅适用于内置控件并且不适用于自定义控件......是否正确?”不,这不是事实。你可能在声明你的控制权时犯了错误。你也应该表明。 – Clemens
以下Clemens评论我试图复制我的情况在一个新的项目。创建从TextBox继承的自定义控件时,隐式样式可以正常工作。但是,当使用完全相同的设置,并将控件从窗口继承(这是我的原始问题)时,隐式样式不起作用。当使用Window作为基类而不是其他控件时,是否存在隐式样式的问题? – user6836683