Пользовательский производный стиль элемента управления WPF

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

    class MyControl : Button{}

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

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

    <ResourceDictionary Source="BureauBlue.xaml" />

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

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

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

person Zim    schedule 13.11.2009    source источник


Ответы (5)


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

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

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

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

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

person Abe Heidebrecht    schedule 13.11.2009
comment
Спасибо, это работает, но странно: если я определю такой стиль в Themes / Generic.xaml, это не даст никакого эффекта. И если я определю этот стиль в своих ресурсах Window или App, тогда все в порядке. Итак, мне неясна ситуация, когда я создаю свой элемент управления ButtonEx в одной сборке и буду использовать его из другой, поэтому как я могу затем определить в своей библиотеке элементов управления, что мой элемент управления ButtonEx должен по умолчанию выглядеть как Button? - person Zim; 13.11.2009

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

person Bryce Kahle    schedule 13.11.2009


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

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

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

person viky    schedule 13.11.2009
comment
Стиль для кнопки в BureauBlue.xaml не имеет ключа и определяется следующим образом: ‹Style TargetType = {x: Type Button} BasedOn = {x: Null}› ... ‹/Style› - person Zim; 13.11.2009