2010-11-19 11 views
2

Ich baue eine SL4 App. Ich habe zwei Steuerelemente, eine obere Suchleiste und eine untere Favoritenleiste, die ich auf jeder Seite sehen möchte. Ich bin nicht sicher, was der beste Weg ist, dies zu tun.Silverlight: Zeigen Sie die gleichen Kontrollen auf jeder Seite

Mein aktueller Ansatz verwendet einen nav Rahmen als Root-visuellen:

App.xaml.cs:

this.RootVisual = new NavFrame();

NevFrame.xaml:

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 

    <my:TopSearchBar x:Name="topSearchBar" Grid.Row="0"/> 

    <navigation:Frame x:Name="navigationFrame" Source="/HomePage.xaml" Grid.Row="1"/> 

    <my:BottomFavoritesBar x:Name="bottomFavoritesBar" Grid.Row="2"/> 

</Grid> 

Dann würde ich die Seiten innerhalb des Frames wechseln und das Persistente verlassen Elemente an Ort und Stelle. Ist das der richtige Ansatz oder gibt es ein anderes bevorzugtes Muster?

Wenn ich dies jedoch tun, bin ich mir nicht sicher, wie die TopSearchBar und BottomFavoritesBar Benutzersteuerelemente Navigation ausführen können. (Im Allgemeinen bin ich nicht sicher, wie die Navigation von einem UserControl direkt zu tun.)

Wenn TopSearchBar ein Mitglied jeder Seite war, habe ich diesen Code auf jeder Seite des Code-Behind haben würde:

topSearchBar.ParentPage = this; 

TopSearchBar könnte dann benutzen Sie diese Referenz Navigation zu tun:

ParentPage.NavigationService.Navigate(new Uri("/SearchPage.xaml?q=" + searchBox.Text, UriKind.Relative)); 

gibt es einen besseren Weg, dies zu tun? Es fühlt sich etwas peinlich an. Wenn die Navigation einen Verweis auf eine Seite erfordert, wie kann ich diese Referenz von NavFrame übergeben?

Antwort

2

Der geeignete Ansatz besteht darin, den TopSearchBar und BottomFavoritesBar genannten "Navigator" (oder was immer Sie bevorzugen) eine Abhängigkeitseigenschaft hinzuzufügen, die den Typ INavigate hat.

XAML würde wie folgt aussehen: -

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 

    <my:TopSearchBar x:Name="topSearchBar" Grid.Row="0" Navigator="{Binding ElementName=navigationFrame}"/> 

    <navigation:Frame x:Name="navigationFrame" Source="/HomePage.xaml" Grid.Row="1"/> 

    <my:BottomFavoritesBar x:Name="bottomFavoritesBar" Grid.Row="2" Navigator="{Binding ElementName=navigationFrame}" /> 

</Grid> 

Jetzt in Ihrer zwei Bar Bedienelemente Navigation ist einfach: -

Navigator.Navigate(new Uri("/SearchPage.xaml?q=" + searchBox.Text, UriKind.Relative)); 

bearbeiten

die Abhängigkeitseigenschaften zu erstellen Fügen Sie dies zu Ihrer TopSearchBar Klasse hinzu: -

Duplizieren Sie dies in Ihrer BottomFavoritesBar Klasse, aber ändern Sie den Verweis auf TopSearchBar.

+0

Können Sie zeigen, wie Sie Abhängigkeitseigenschaften verwenden würden, dies zu tun? Ich bin mir nicht sicher, was genau sie sind oder warum du sie hier brauchst. –

+0

@Rosarch: Siehe meine Bearbeitung. – AnthonyWJones

+0

nett! das funktioniert großartig. Können Sie mir erklären, warum ich hier eine Dependency-Eigenschaft brauche und nicht nur eine normale CLR-Eigenschaft? –

1

Ich schlage vor, um Prism CAL Pattern

Auf diese Weise suchen Sie Regionen für Ihren Container und die Region schaffen (n) von Seite zu Seite geändert werden soll ... es ist einfach, tauschen Sie einfach die neuen das alte ersetzen, während die anderen an Ort und Stelle bleiben. Es ist meiner Meinung nach ein viel schlankerer Ansatz.

http://development-guides.silverbaylabs.org/Video/Silverlight-Prism

+0

Suchen Sie speziell nach einer Injektion für ein Region-Objekt oder erstellen Sie eine zusammengesetzte Ansicht ... PRISM4-Handbuch hat eine gute Erklärung, wie es geht. –

Verwandte Themen