c# wpf xaml

c# - ¿Cómo hacer que un estilo WPF sea heredable de las clases derivadas?



xaml (1)

En nuestra aplicación WPF tenemos un estilo global con TargetType={x:Type ContextMenu} . He creado un MyContextMenu que deriva de ContextMenu, pero ahora el estilo predeterminado no se aplica.

¿Cómo puedo decirle a WPF que quiero que MyContextMenu herede el estilo predeterminado de ContextMenu? Con suerte, puedo hacer esto desde dentro de mi propio control (a través de la anulación de metadatos estáticos de ctor o algo así) y no tener que meterme en ningún xaml.


Si tienes un estilo definido en tu aplicación así:

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

Entonces ese es un estilo implícito, no un estilo predeterminado. Los estilos predeterminados generalmente se ubican en el mismo ensamblaje que el control o en ensamblajes coincidentes (es decir, MyAssembly.Aero.dll).

Los estilos implícitos no se aplican automáticamente a los tipos derivados, que es probablemente lo que está viendo.

Puedes definir un segundo estilo, así:

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

O puede aprovechar la propiedad de estilo de su control. Podrías hacer lo siguiente desde XAML.

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

o puedes hacer esto en tu MyContextMenu así:

public MyContextMenu() { this.SetResourceReference(StyleProperty, typeof(ContextMenu)); }