2017-09-28 46 views
0

我的自定义控件的默认样式在Generic.xaml中定义,并且工作正常。在WPF中设置自定义控件的隐式样式

但是,当我尝试改变我的自定义控件的样式时,就像使用内置控件时一样,没有任何反应。在App.xaml中我试图通过以下操作来改变我的控制的默认样式:

<Style TargetType="{x:Type my:CustomControl}"> 
    <Setter Property="Background" Value="Red"/> 
</Style> 

如果我设置x:上述风格和参考的关键属性使用该密钥的所有工作正常,这种风格。

上述造型方法仅适用于内置控件,不适用于自定义控件,或者我只是做错了什么?是否有一个可行的解决方案来实现这种自定义控件的样式?

更新 在这种情况下,我的自定义控件是从System.Windows.Window派生的。

+1

你在静态构造函数设置DefaultStyleKeyProperty.OverrideMetadata或你正在做一些解决方法吗? – shadow32

+0

“上述造型方法仅适用于内置控件并且不适用于自定义控件......是否正确?”不,这不是事实。你可能在声明你的控制权时犯了错误。你也应该表明。 – Clemens

+0

以下Clemens评论我试图复制我的情况在一个新的项目。创建从TextBox继承的自定义控件时,隐式样式可以正常工作。但是,当使用完全相同的设置,并将控件从窗口继承(这是我的原始问题)时,隐式样式不起作用。当使用Window作为基类而不是其他控件时,是否存在隐式样式的问题? – user6836683

回答

0

我终于设法让我的自定义控件工作的隐式样式。显然隐式样式可能不适用于派生控件,因为样式不会自动应用于控件。为了实现这个,必须手动设置资源引用。我的自定义控件现在看起来是这样的:

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

    public CustomControl() 
    { 
     SetResourceReference(StyleProperty, typeof(CustomControl)); 
    } 
} 
-1

是的,你是对的。 Generic.xaml用于自定义控件,App.xaml用于应用程序范围的资源(包括内置控件的样式)。对于App.xaml中的自定义控件指定TargetType将不起作用。所以使用明确的样式(与x:Key)似乎是最简单的解决方案。

+0

这显然是错误的。您当然可以在Generic.xaml中(通常在控件库程序集中)使用默认控件样式,而在App.xaml中使用另一个默认样式。后者将自动基于前者。 – Clemens