WPF Style elemento attivo
-
22-08-2019 - |
Domanda
Sto tentando di creare uno stile di navigazione riutilizzabile Controllo personalizzato in WPF, come una barra di navigazione su un sito web. Conterrà collegamenti a tutte le principali Pagine nella mia app. Questo controllo può andare in cima a tutte le mie pagine nei miei NavigationWindow. Dando un bel aspetto coerente tra le pagine, come un sito web.
Il mio problema è nel styling collegamento della pagina corrente in modo diverso rispetto alle altre pagine link, in modo che si può rapidamente un'occhiata a esso e vedere quale pagina si è in. Dal momento che il controllo è lo stesso in ogni pagina, ho bisogno di dirgli che la pagina è "attivo" e l'abbiano in stile che puntano in modo appropriato.
Il mio primo pensiero è stato quello di semplicemente posto è
Esempio:
<local:Header IsHomePageActive="True" />
Ora nel modello di controllo per la mia intestazione controllo personalizzato, posso creare un DataTrigger che guarda quest'affare:
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource FindAncestor, AncestorType={x:Type local:Header}}, Path=IsHomePageActive}" Value="true">
<Setter ... />
<Setter ... />
<Setter ... />
</DataTrigger>
</Style>
Dopo tutto questo sfondo, ecco la mia domanda. Questo funziona, ma ho intenzione di avere per duplicare che DataTrigger, e tutti i Setter in esso, per ogni singola pagina che ho, perché il innesco deve fare riferimento direttamente la struttura "IsHomePageActive" che applica solo a quello collegamento. Quindi ho bisogno di uno stile diverso per ogni link, anche se lo stile attuale la sua descrizione è esattamente lo stesso (e con questo intendo, i Setter sono gli stessi). L'unica differenza è quale proprietà il grilletto sta guardando.
C'è qualche modo per fare questo (o qualcosa del genere con lo stesso risultato finale) senza finire con centinaia di righe di XAML duplicato?
Soluzione
Come sull'utilizzo di un modello master / dettaglio () con una casella di riepilogo (diciamo) come master e le vostre pagine come i dettagli.
Quindi specificare il vostro stile per l'elemento selezionato nell'elenco.
La pagina cambierà quando si seleziona un elemento della lista diversa e avrà un aspetto diverso per gli altri oggetti.
se si dispone di una proprietà di dipendenza, come Elenco pagine dove Pagina eredita da UserControl e ha un titolo di stringa è possibile utilizzare
<ListBox
ItemsSource="{Binding Pages}"
IsSynchronizedWithCurrentItem="true">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Title}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ScrollViewer VerticalScrollBarVisibility="Auto"
Content="{Binding Pages/}" />
stile Poi basta impostare per l'elemento selezionato sulla casella di riepilogo