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 Propriétés actifs sur le contrôle, un pour chaque page, puis définissez la propriété appropriée à true sur la page. (Ou je pouvais utiliser une propriété qui accepte une valeur Enum au lieu d'avoir de nombreuses propriétés, de toute façon)

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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top