WPF自定义派生控件样式

9

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

    class MyControl : Button{}

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

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

    <ResourceDictionary Source="BureauBlue.xaml" />

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

更新:BureauBlue.xaml文件中Button的样式没有键,并且定义方式如下:

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

18

在静态构造函数中,您重写了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中定义这样的样式,则无效。但如果我在我的窗口或应用程序资源中定义此样式,则一切正常。因此,如果我在一个程序集中创建了ButtonEx控件,并希望从另一个程序集中使用它,那么我该如何在我的控件库中定义ButtonEx默认外观应该类似于Button? - Zim

3

3

对于继承自指定类型的类,TargetType属性不起作用。请参考此问题


2

如果要完全在代码中完成这个操作,可以参考另一个论坛上的这个回答

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

0

检查你的BureauBlue.xaml文件中是否存在Button样式,并且如果有x:key属性,请将其移除。


BureauBlue.xaml 中 Button 的样式没有键,并按照以下方式定义: <Style TargetType="{x:Type Button}" BasedOn="{x:Null}"> ...</Style> - Zim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接