Пользовательский производный стиль управления WPF - PullRequest
8 голосов
/ 13 ноября 2009

У меня есть пользовательский элемент управления, полученный из кнопки:

    class MyControl : Button{}

И, предположим, этот класс пуст (не имеет членов).

В ресурсах главного окна приложения я использую ResourceDictionary, который содержит стили для большинства WPF элементов управления (так называемая тема):

    <ResourceDictionary Source="BureauBlue.xaml" />

Итак, все элементы управления в окне выглядят так, как будто оно определено в этом файле темы. Но стили не влияют на элементы управления MyControl. Как я могу сделать MyControl похожим на элементы управления Button?

Обновление: стиль для Button в BureauBlue.xaml не имеет ключа и определяется следующим образом:

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

Ответы [ 5 ]

17 голосов
/ 13 ноября 2009

Вы переопределяете метаданные DefaultStyleKey в своем статическом конструкторе:

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

Затем в своих ресурсах вы можете основывать его стиль на кнопке:

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

В прошлом я пытался переопределить метаданные DefaultStyleKey, чтобы они указывали на базовый класс (кнопка в вашем случае), но, похоже, он не работает.

3 голосов
/ 13 ноября 2009

Свойство TargetType не работает для классов, производных от указанного типа. См этот вопрос

1 голос
/ 01 апреля 2016

Я использую SetResourceReference

SetResourceReference(StyleProperty, typeof(Button));
1 голос
/ 02 февраля 2016

Для этого полностью в коде этот ответ на другом форуме работает

this.Style = new Style(GetType(), this.FindResource(typeof(System.Windows.Controls.Button)) as Style);
0 голосов
/ 13 ноября 2009

Проверьте, есть ли стиль для Button в вашем BureauBlue.xaml и удалите атрибут x: key из стиля, если он там есть

...