2009-11-13 11 views
5

WPF personalizzato Ho un controllo personalizzato derivato da Button:derivato stile di controllo

class MyControl : Button{} 

e supponiamo, questa classe è vuota (non ha membri).

In risorse principali della finestra dell'applicazione io uso ResourceDictionary che contiene gli stili per la maggior parte WPF controlli (cd tema):

<ResourceDictionary Source="BureauBlue.xaml" /> 

Quindi, tutti i controlli l'aspetto finestra come essa è definita nel file tema. Ma gli stili non sono interessati dai controlli MyControl. Come posso fare MyControl per avere lo stesso effetto dei controlli Button?

Aggiornamento: Lo stile per Button nella BureauBlue.xaml ha alcun tasto ed è definito nel seguente modo:

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

risposta

14

È ignorare i metadati del DefaultStyleKey nel costruttore statico:

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

Poi, nelle risorse, è possibile basare il suo stile sul pulsante:

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

ho provato a il passato per scavalcare i metadati di DefaultStyleKey per puntare alla classe base (Button nel tuo caso), ma non sembra funzionare.

+6

Grazie, funziona, ma strano: se definisco tale stile in Themes/Generic.xaml questo non ha alcun effetto. E se definisco questo stile nelle risorse Window o App, allora tutto è ok. Quindi, non mi è chiara la situazione quando creo il mio controllo ButtonEx in un assembly e lo utilizzerò da un altro, quindi come potrei quindi definire nella mia libreria di controllo che il mio controllo ButtonEx dovrebbe apparire come pulsante per impostazione predefinita? – Zim

0

Verificare se lo stile di Button è lì nel tuo BureauBlue.xaml e rimuovere x: chiave attributo dallo stile se è presente

+0

Lo stile per Button nella BureauBlue.xaml ha alcun tasto ed è definito seguente saggio: Zim

3

La proprietà TargetType non funziona per le classi che derivano dal tipo specificato. Vedere this question

1

Per fare questo completamente nel codice this answer on another forum funziona

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