2009-03-28 12 views
0

Ich versuche, eine wiederverwendbare Navigationsstil Custom Control in WPF, wie eine Navigationsleiste auf einer Website zu erstellen. Es enthält Links zu allen Hauptseiten in meiner App. Dieses Steuerelement kann auf alle meine Seiten in meinem NavigationWindow gehen. Geben Sie ein einheitliches Erscheinungsbild über Seiten wie eine Website.WPF Style Active Item

Mein Problem besteht darin, den Link der aktuellen Seite anders zu formatieren als die Links der anderen Seiten, so dass Sie schnell einen Blick darauf werfen und sehen können, auf welcher Seite Sie gerade sind. Da das Steuerelement auf jeder Seite das gleiche ist, muss ich ihm mitteilen, welche Seite "aktiv" ist und über den entsprechenden Stil verfügen.

Mein erster Gedanke war, einfach Eigenschaften für das Steuerelement zu platzieren, eine für jede Seite, und dann die entsprechende Eigenschaft auf der Seite auf true festlegen. (Oder ich könnte eine Eigenschaft, die einen Enum-Wert akzeptiert, anstatt viele Eigenschaften aufweisen, so oder so)

Beispiel:

<local:Header IsHomePageActive="True" /> 

nun in der Steuer Vorlage für meinen Kopf Custom Control, kann ich eine Datatrigger dass Uhren diese Eigenschaft:

<Style.Triggers> 
    <DataTrigger Binding="{Binding RelativeSource FindAncestor, AncestorType={x:Type local:Header}}, Path=IsHomePageActive}" Value="true"> 
    <Setter ... /> 
    <Setter ... /> 
    <Setter ... /> 
    </DataTrigger> 
</Style> 

Nach all dem Hintergrund, hier ist meine Frage. Das funktioniert, aber ich muss diesen DataTrigger und alle Setter darin für jede einzelne Seite duplizieren, da der Trigger direkt auf die Eigenschaft "IsHomePageActive" verweisen muss, die nur für den einen Link gilt. Also brauche ich für jeden Link einen anderen Style, obwohl der eigentliche STYLE dessen Beschreibung genau gleich ist (womit ich meine, die Setter sind gleich). Der einzige Unterschied besteht darin, welche Eigenschaft der Trigger überwacht.

Gibt es eine Möglichkeit, dies zu tun (oder etwas mit dem gleichen Endergebnis), ohne mit Hunderten von Zeilen duplizierten XAML enden?

Antwort

1

Wie wäre es mit einem Master/Detail-Muster() mit einer Listbox (sagen wir) als Master und Ihre Seiten als Details.

Geben Sie dann Ihren Stil für das ausgewählte Element in der Liste an.

Die Seite wird geändert, wenn ein anderes Listenelement ausgewählt wird und sich von den anderen Elementen unterscheidet.

, wenn Sie eine Abhängigkeitseigenschaft wie Liste auf Seiten, wo Seite von Usercontrol erbt und hat einen String Titel können Sie mit

 <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/}" /> 

Dann einfach eingestellt Stil für das ausgewählte Element auf der Listbox