Извлечен по избор стил на управление на WPF

Имам персонализирана контрола, получена от Button:

    class MyControl : Button{}

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

В ресурсите на главния прозорец на приложението използвам ResourceDictionary, който съдържа стилове за повечето WPF контроли (така наречената тема) :

    <ResourceDictionary Source="BureauBlue.xaml" />

И така, всички контроли в прозореца изглеждат така, сякаш са дефинирани в този файл на темата. Но стиловете не се влияят върху контролите MyControl. Как мога да направя така, че MyControl да изглежда по същия начин като контролите на бутона?

Актуализация: Стилът за бутон в 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, за да сочат към основния клас (във вашия случай бутон), но изглежда не работи.

person Abe Heidebrecht    schedule 13.11.2009
comment
Благодаря, това работи, но странно: ако дефинирам такъв стил в Themes/Generic.xaml, това няма ефект. И ако дефинирам този стил в моите ресурси за прозорец или приложение, тогава всичко е наред. И така, за мен е неясна ситуацията, когато създам моята контрола ButtonEx в една сглобка и ще я използвам от друга, така че как мога след това да дефинирам в моята контролна библиотека, че моята контрола ButtonEx трябва да изглежда като бутон по подразбиране? - person Zim; 13.11.2009

Свойството TargetType не работи за класове, които произлизат от посочения тип. Вижте този въпрос

person Bryce Kahle    schedule 13.11.2009

Използвам SetResourceReference

SetResourceReference(StyleProperty, typeof(Button));
person xmedeko    schedule 01.04.2016

За да направите това напълно в код този отговор в друг форум работи

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
Стилът за Button в BureauBlue.xaml няма ключ и се дефинира по следния начин: ‹Style TargetType={x:Type Button} BasedOn={x:Null}› ...‹/Style› - person Zim; 13.11.2009