2010-11-19 23 views
2

私はSL4アプリケーションを構築しています。私は2つのコントロールを持っています。トップの検索バーとボトムのお気に入りバーは、すべてのページに存在したいと思っています。私はこれを行う最良の方法が何であるか分かりません。Silverlight:すべてのページに同じコントロールを表示

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> 

は私の現在のアプローチは、視覚的なルートとしてNAVフレームを使用します次に、フレーム内のページを変更して、永続的な場所の要素。これは正しいアプローチですか、それとも他の好みのパターンがありますか?

しかし、これを行うと、TopSearchBarBottomFavoritesBarのユーザーコントロールがナビゲーションを行う方法がわかりません。 (一般的には、私はUserControlから直接ナビゲーションを行うするかどうかはわかりません。)

TopSearchBarは、各ページのメンバーだったとき、私は、各ページのコードビハインドにこのコードを持っていると思います:

topSearchBar.ParentPage = this; 

TopSearchBarは、ナビゲーションを行うには、このリファレンスを使用することができます。

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

はこれを行うには良い方法はありますか?やや厄介な気がする。ナビゲーションにページへの参照が必要な場合は、NavFrameからどのように参照を渡すことができますか?

答えて

2

適切な方法は、タイプINavigateの「ナビゲータ」(または好きなもの)と呼ばれるTopSearchBarBottomFavoritesBarの両方に依存プロパティを追加することです。

あなたのXAMLは次のようになります -

<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> 

今すぐあなたの2つのバーのユーザーコントロールにナビゲーションが単純である: -

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

編集

依存関係プロパティを作成するにはこれをTopSearchBarクラスに追加します。 -

public INavigate Navigator 
    { 
     get { return GetValue(NavigatorProperty) as INavigate; } 
     set { SetValue(NavigatorProperty, value); } 
    } 


    public static readonly DependencyProperty NavigatorProperty = 
     DependencyProperty.Register(
      "Navigator", 
      typeof(INavigate), 
      typeof(TopSearchBar), 
      new PropertyMetadata(null)); 

BottomFavoritesBarクラスでこれを複製しますが、参照先をTopSearchBarに変更してください。

+0

あなたはこれを行うには依存関係プロパティを使用する方法を示しすることはできますか?私は彼らが何であるか、なぜここにそれらが必要なのかは分かりません。 –

+0

@Rosarch:私の編集を参照してください。 – AnthonyWJones

+0

nice!それは素晴らしい作品です。私はここで、通常のCLRプロパティだけでなく、依存プロパティを必要としている理由を説明できますか? –

1

私はあなたのコンテナとあなたがページからページへ変更したい地域(複数可)のための領域を作成することができます。この方法では、プリズムCALパターン

に見て示唆...それは簡単です、あなただけの新しいものを交換古いものを置き換え、他のものはそのまま残ります。それは私の意見でははるかに合理化されたアプローチです。

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

+0

特にRegionオブジェクトのViewインジェクションを探したり、コンポジットビューを作成してください... PRISM4マニュアルには、どのようにするか説明があります。 –

関連する問題