2009-11-13 27 views
5

que tiene un control personalizado derivado de botón:WPF estilo personalizado de control derivada

class MyControl : Button{} 

Y supongamos, esta clase está vacía (no tiene miembros).

En los principales recursos de la ventana de la aplicación que utilice ResourceDictionary que contiene estilos para la mayoría de WPF controles (denominado temáticos):

<ResourceDictionary Source="BureauBlue.xaml" /> 

Por lo tanto, todos los controles en el aspecto de la ventana como se define en ese archivo de tema. Pero los estilos no se ven afectados en los controles de MyControl. ¿Cómo puedo hacer que MyControl se vea igual que los controles de un botón?

Actualización: El estilo de botón en BureauBlue.xaml no tiene clave y se define de la siguiente manera:

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

Respuesta

14

Puede alterar temporalmente los metadatos del DefaultStyleKey en su constructor estático:

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

Luego, en sus recursos, puede basar su estilo en el botón:

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

que he probado en el pasado para anular los metadatos de DefaultStyleKey para apuntar a la clase base (Button en su caso), pero parece que no funciona.

+6

Gracias, eso funciona, pero extraño: si defino dicho estilo en Themes/Generic.xaml esto no da ningún efecto. Y si defino este estilo en mis recursos de Ventana o Aplicación, entonces todo está bien. Entonces, no está claro para mí la situación cuando creo mi control ButtonEx en un ensamblaje y lo usaré desde otro, entonces ¿cómo podría entonces definir en mi biblioteca de control que mi control ButtonEx debería verse como un botón por defecto? – Zim

0

Comprobar si el estilo de botón está allí en su BureauBlue.xaml y retire x: clave atributo del estilo si está allí

+0

El estilo de botón en BureauBlue.xaml no tiene clave y se define siguiendo sabia: <= Estilo TargetType "{x: Type Button}" BasedOn = "{x: Null}"> ... – Zim

3

La propiedad TargetType no funciona para las clases que se derivan del tipo especificado. Ve this question

1

Para hacer esto por completo en código this answer on another forum funciona

this.Style = new Style(GetType(), this.FindResource(typeof(System.Windows.Controls.Button)) as Style); 
Cuestiones relacionadas