WPF style élément actif
-
22-08-2019 - |
Question
Je cherche à créer un style de navigation réutilisable contrôle personnalisé dans WPF, comme une barre de navigation sur un site Web. Il contiendra des liens vers toutes les pages principales dans mon application. Ce contrôle peut aller au-dessus de toutes mes pages dans NavigationWindow. Donner une belle apparence cohérente à travers les pages, comme un site Web.
Ma question est dans le lien coiffant la page actuelle différemment que les liens des autres pages, de sorte que vous pouvez rapidement et à coup d'oeil voir la page que vous êtes. Étant donné que le contrôle est le même sur chaque page, je dois le dire quelle page est « actif » et avoir le style qui lien approprié.
Ma première pensée était simplement lieu est
Exemple:
<local:Header IsHomePageActive="True" />
dans le modèle de commande pour mon contrôle personnalisé en-tête, je peux créer un DataTrigger qui regarde cette propriété:
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource FindAncestor, AncestorType={x:Type local:Header}}, Path=IsHomePageActive}" Value="true">
<Setter ... />
<Setter ... />
<Setter ... />
</DataTrigger>
</Style>
Après tout ce contexte, voici ma question. Cela fonctionne, mais je vais devoir reproduire ce DataTrigger, et tous les Setters en elle, pour chaque page que j'ai, parce que le trigger doit référencer directement la propriété « IsHomePageActive » qui ne concerne que le seul lien. Donc je besoin d'un style différent pour chaque lien, même si le style actuel de sa description est exactement la même chose (je veux dire, les Setters sont les mêmes). La seule différence est que la propriété sur la gâchette regarde.
Est-il possible de le faire (ou quelque chose avec le même résultat final) sans se retrouver avec des centaines de lignes de XAML en double?
La solution
Que diriez-vous à l'aide d'une zone de liste (par exemple) en tant que maître et vos pages comme les détails d'un modèle maître / détail ().
Indiquez ensuite votre style pour l'élément sélectionné dans la liste.
La page change lorsqu'un élément de liste différent est sélectionné et il sera différent des autres éléments.
si vous avez une propriété de dépendance tels que la liste des pages où la page hérite de UserControl et a un titre de chaîne que vous pouvez utiliser
<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/}" />
Ensuite, il suffit de style défini pour l'élément sélectionné sur la zone de liste