2009-11-13 206 views
5

我有按钮派生的自定义控制:WPF定制衍生控制风格

class MyControl : Button{} 

再假设,这个类是空的(没有成员)。

在应用程序的主窗口资源,我用资源字典包含的样式大部分WPF控制(所谓的主题):

<ResourceDictionary Source="BureauBlue.xaml" /> 

所以,在窗口看所有控件就像是在主题文件中定义。但是这些样式在MyControl控件上不受影响。我怎样才能使MyControl看起来与Button控件相同?

更新:在BureauBlue.xaml按钮的样式没有密钥,并在下面的方式定义:

<Style TargetType="{x:Type Button}" BasedOn="{x:Null}"> ...</Style> 

回答

14

你在你的静态构造函数重载DefaultStyleKey的元数据:

static MyControl() 
{ 
    DefaultStyleKeyProperty.OverrideMetadata(
     typeof(MyControl), 
     new FrameworkPropertyMetadata(typeof(MyControl))); 
} 

然后,在你的资源,你可以基座上的按钮它的风格:

<Style TargetType="{x:Type lcl:MyControl}" BasedOn="{StaticResource {x:Type Button}}" /> 

我已经试过过去重写DefaultStyleKey的元数据来指向基类(在你的情况下是Button),但它似乎不起作用。

+6

谢谢,这很有效,但很奇怪:如果我在Themes/Generic.xaml中定义了这种样式,则不起作用。如果我在我的Window或App资源中定义了这种风格,那么一切都很好。 因此,我不清楚当我在一个程序集中创建ButtonEx控件并从另一个程序集中使用它的情况,那么如何在控件库中定义我的ButtonEx控件应该默认为Button? – Zim 2009-11-13 18:37:35

0

检查样式按钮,在那里你BureauBlue.xaml 并删除X:关键属性从样式中返回

+0

的样式按钮在BureauBlue.xaml没有密钥,并定义如下忠告: <样式的TargetType = “{x:Type Button}”BasedOn =“{x:Null}”> ... – Zim 2009-11-13 15:15:53

3

TargetType属性不适用于派生自指定类型的类。见this question

1

对于完全代码this answer on another forum做这个工作

this.Style = new Style(GetType(), this.FindResource(typeof(System.Windows.Controls.Button)) as Style);