2009-09-29 12 views
14

Sto creando un semplice controllo personalizzato che si estende dal pulsante di attivazione/disattivazione che consente all'utente di specificare il contenuto selezionato e deselezionato direttamente in XAML. Funziona bene ma si basa su un trigger e non so come definire il trigger tranne in uno stile. Se definisco lo stile, perdo tutto ciò che è impostato al di fuori del controllo personalizzato.Come aggiungere un trigger a un controllo personalizzato WPF senza sovrascrivere lo stile esistente?

Quello che vorrei essere in grado di fare è semplicemente aggiungere questo trigger a qualsiasi stile esistente impostato altrove sul controllo.

Ecco lo XAML per lo stile/trigger.

<ToggleButton.Style> 
    <Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource {x:Type ToggleButton}}"> 
     <Setter Property="Content" Value="{Binding RelativeSource={RelativeSource Self}, Path=UncheckedContent}" /> 
     <Style.Triggers> 
      <Trigger Property="IsChecked" Value="True"> 
       <Setter Property="Content" 
         Value="{Binding RelativeSource={RelativeSource Self}, Path=CheckedContent}" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ToggleButton.Style> 

ho provato ereditando lo stile attraverso il BasedOn con un tipo di default, ma non funziona se il controllo personalizzato ha uno stile esplicito fissato dal suo genitore. Ho anche considerato EventTriggers ma non credo che ci sarebbe un evento per inizializzare il controllo.

Grazie per l'aiuto che chiunque può offrire. :)

risposta

17

Solo per chiarire le cose sulla terminologia qui: Un controllo utente è un controllo che deriva dalla classe UserControl. Se ho capito bene hai derivato da ToggleButton per aggiungere le proprietà UncheckedContent e CheckedContent. In tal caso è stato creato un controllo personalizzato . È sempre più facile da seguire se siamo d'accordo su una terminologia comune :)

Per quanto ne so non si può fare un'ereditarietà di stile così generica in XAML. Devi sempre specificare esplicitamente a quale stile si basa un altro stile. Il tuo stile può essere basato sullo stile predefinito per ToggleButton o su un altro stile specifico. Se non riesci a costruire una catena ereditaria di stile che rispetti ciò, questo approccio non funzionerà.

Ma dal momento che si dispone di un controllo personalizzato, non è possibile scrivere uno stile predefinito basato sullo stile di pulsante di attivazione predefinito come questo?

<Style TargetType="{x:Type CustomToggleButton}" 
     BasedOn="{StaticResource {x:Type ToggleButton}}"> 

Poi ogni volta che si applica uno stile esplicito a un pulsante di commutazione si precisa che si basa sul pulsante stile predefinito di commutazione.

Inoltre, è possibile scrivere un modello di controllo (predefinito) per il nuovo pulsante di attivazione in Temi \ Generico.xaml che contiene i trigger precedenti. Nella fusione puoi ottenere una copia del modello predefinito per il pulsante di attivazione/disattivazione ("Modifica modello" -> "Modifica una copia") in modo da poter verificare che il pulsante di attivazione sia esattamente come il normale pulsante di attivazione/disattivazione. Quindi incorporare i trigger sopra in quel modello.

BTW: non è necessario creare un nuovo controllo solo per aggiungere nuove proprietà. È possibile aggiungere nuove proprietà a un controllo esistente utilizzando attached properties. Possono essere utilizzati da XAML proprio come le normali proprietà.

+0

Grazie per l'input, è stato molto utile. Ho seguito un percorso leggermente diverso e ho esteso lo stile esistente nel codice per aggiungere il mio trigger senza rovinare quello esistente. Il suggerimento di BasedOn che hai fatto l'ho già provato e non funziona se è impostato uno stile esplicito. Sono arrivato dalle tue idee, quindi lo segnalo come risposta. L'idea delle proprietà allegate era davvero buona e ho apportato anche questo cambiamento, grazie. :) –

+1

Ti dispiacerebbe postare alcuni dettagli di ciò che hai fatto? Mi piacerebbe fare la stessa cosa – stone

+0

Questo mi ha appena salvato un sacco di codice. Grazie! – MattS423

Problemi correlati