Как сделать стиль WPF наследуемым для производных классов?

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

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

Ответ 1

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

<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));
}