WPF custom derived control style

妖精的绣舞 提交于 2019-12-30 06:09:11

问题


I have a custom control derived from Button:

    class MyControl : Button{}

And suppose, this class is empty (has no members).

In the application's main window resources I use ResourceDictionary that contains styles for most WPF controls (so called theme):

    <ResourceDictionary Source="BureauBlue.xaml" />

So, all controls on the window look like it is defined in that theme file. But the styles are not affected on MyControl controls. How can I do MyControl to look same as a Button controls?

Update: The style for Button in BureauBlue.xaml has no key and is defined in the following way:

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

回答1:


You override the DefaultStyleKey's metadata in your static constructor:

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

Then, in your resources, you can base its style on the button:

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

I've tried in the past to override the DefaultStyleKey's metadata to point to the base class (Button in your case), but it doesn't seem to work.




回答2:


The TargetType property doesn't work for classes that derive from the specified type. See this question




回答3:


I use SetResourceReference

SetResourceReference(StyleProperty, typeof(Button));



回答4:


For doing this completely in code this answer on another forum works

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



回答5:


Check if style for Button is there in your BureauBlue.xaml and remove x:key attribute from the style if it is there



来源:https://stackoverflow.com/questions/1729161/wpf-custom-derived-control-style

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!