WPF自定义派生控件样式

时间:2009-11-13 13:19:06

标签: c# wpf controls styles

我有一个从Button派生的自定义控件:

    class MyControl : Button{}

并且假设这个类是空的(没有成员)。

在应用程序的主窗口资源中,我使用的ResourceDictionary包含大多数WPF控件的样式(所谓的主题):

    <ResourceDictionary Source="BureauBlue.xaml" />

因此,窗口上的所有控件看起来都像是在该主题文件中定义的。但是MyControl控件上的样式不受影响。如何使MyControl看起来像Button控件一样?

更新:BureauBlue.xaml中Button的样式没有键,并按以下方式定义:

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

5 个答案:

答案 0 :(得分:17)

您在静态构造函数中覆盖DefaultStyleKey的元数据:

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

然后,在您的资源中,您可以将其样式基于按钮:

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

我过去曾尝试覆盖DefaultStyleKey的元数据以指向基类(在您的情况下为Button),但它似乎不起作用。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

在代码this answer on another forum中完全执行此操作

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

答案 3 :(得分:1)

我使用SetResourceReference

SetResourceReference(StyleProperty, typeof(Button));

答案 4 :(得分:0)

检查您的BureauBlue.xaml中是否有Button的样式 并从样式中删除x:key属性(如果存在)