Как сделать стиль WPF наследуемым для производных классов? - PullRequest
17 голосов
/ 21 июля 2011

В нашем приложении WPF у нас есть глобальный стиль с TargetType={x:Type ContextMenu}. Я создал MyContextMenu, который является производным от ContextMenu, но теперь стиль по умолчанию не применяется.

Как я могу сказать WPF, что я хочу, чтобы MyContextMenu наследовал стиль по умолчанию от ContextMenu? Надеюсь, я смогу сделать это изнутри своего элемента управления (через переопределение метаданных статического ctor-файла или что-то в этом роде?), И мне не придется возиться в любом xaml.

1 Ответ

47 голосов
/ 21 июля 2011

Если у вас есть стиль, определенный в вашем приложении, например:

<Style TargetType="{x:Type ContextMenu}" ...

Тогда это неявный стиль, а не стиль по умолчанию. Стили по умолчанию обычно располагаются в той же сборке, что и элемент управления, или в соответствующих сборках (т.е. MyAssembly.Aero.dll).

Неявные стили не применяются автоматически к производным типам, и это, вероятно, то, что вы видите.

Вы можете определить второй стиль, например:

<Style x:Key="{x:Type ContextMenu}" TargetType="{x:Type ContextMenu}" ...
<Style TargetType="{x:Type local:MyContextMenu}" BasedOn="{StaticResource {x:Type ContextMenu}}" ...

Или вы можете использовать свойство Style вашего элемента управления. Вы можете сделать следующее из XAML

<local:MyContextMenu Style="{DynamicResource {x:Type ContextMenu}}" ...

или вы можете сделать это в вашем MyContextMenu следующим образом:

public MyContextMenu() {
    this.SetResourceReference(StyleProperty, typeof(ContextMenu));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...