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 è proprietà di Active sul controllo, una per ogni pagina, e quindi impostare la proprietà appropriata su true sulla pagina. (O potrei utilizzare una proprietà che accetta un valore Enum invece di avere molte proprietà, in entrambi i casi)

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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top