2012-01-04 6 views
2

4つのボタンを持つRibbonBarがあり、それぞれが別のビューを選択してMainRegionに挿入します。現在のところ、うまくいきますが、4つのビューにはいくつかのコントロールが共通しています。ユーザー名、日付/時刻、検索ボックスなどを表示する今のところ、別々のビューを作成しましたが、コードを繰り返す必要がないようにマスターページ/ UserControlを実装する方法があるかどうかを知りたいと思います。マスターページですが地域用ですか?

のでデザインは、今、そうのようなものです:

シェル

<Window> 
    <Grid> 
     <DockPanel> 
      <RibbonBar Regions:RegionManager.RegionName="ToolbarRegion"> 
      </RibbonBar> 
      <ContentControl Regions:RegionManager.RegionName="MainRegion"> 
      </ContentControl> 
     </DockPanel> 
    </Grid> 
</Window> 

ToolbarRegionは、4つのボタンでRibbonBarが含まれています。

各ボタンは、MainRegionにビューを挿入します。これらのビューには共通のコントロールがいくつかあります(ASP.Netのマスターページによく似ていますが)、各ビューの内容は異なります。

これを回避する方法はありますが(私はシェルのデザインを変更できません)、これを行うにはより良い、よりエレガントな方法があるのだろうかと思っていました。あなたのShell.xaml

+0

もちろん、そういう方法があります。何を試しましたか?共有コンテンツをマスターページに移動し、実際のコンテンツのみをサブビューに保存しようとしましたか? – chopikadze

+0

どのように 'MainRegionにビューを注入するのですか? 'どちらの方法を使いますか?私は非常に近いアプリケーションを持っており、基本的な構造を投稿することができますが、最初に私は今あなたが今使っていることを知る必要があります:) – chopikadze

答えて

2

は、しかし、私は彼らの領域は、アプリケーションのレイアウト(MenuRegionNavigationRegionContentRegion、など)、およびないナビゲーションのためにのみ使用されるべきであると感じています。 Navigationのためにそれらを使用することは、Viewがアプリケーションフローを制御できるようにすることを意味し、ViewModelsの仕事だと感じています。

変更内容を表示するための私の好ましい方法は、あなたが概説のようなものを作成するにはDataTemplatesとContentControls

であり、私は

  • ObservableCollection<IPageViewModel> PageViewModels
  • IPageViewModel SelectedPageViewModel
を含む親のViewModelを持っているでしょう

動的コンテンツを表示したい領域は、ContentControlを使用します。このようUCH:それはそうのItemsSourceを可能にしなければならないよう

<ContentControl Content="{Binding SelectedPage" /> 

そしてDataTemplatesは私が前にRibbonBarを使用していないか、各セクション

<DataTemplate TargetType="{x:Type local:Page1ViewModel}"> 
    <local:Page1View /> 
</DataTemplate> 

<DataTemplate TargetType="{x:Type local:Page2ViewModel}"> 
    <local:Page2View /> 
</DataTemplate> 

<DataTemplate TargetType="{x:Type local:Page3ViewModel}"> 
    <local:Page3View /> 
</DataTemplate> 

を描画するにはWPFを伝えるために使用されるだろう、しかしそれが聞こえます最終的なXAMLはおそらく次のようになります。

<Window> 
    <Grid> 
     <DockPanel> 
      <RibbonBar ItemsSource="{Binding PageViewModels}" 
         SelectedItem="{Binding SelectedPageViewModel}" 
         DockPanel.Dock="Top" ...> 

      </RibbonBar> 

      <StackPanel> 
       <Grid> 
        ... Generic Content 
       </Grid> 

       <ContentControl Content="{Binding SelectedPageViewModel}"> 

        <ContentControl.Resources> 
         <DataTemplate TargetType="{x:Type local:Page1ViewModel}"> 
          <local:Page1View /> 
         </DataTemplate> 
         <DataTemplate TargetType="{x:Type local:Page2ViewModel}"> 
          <local:Page2View /> 
         </DataTemplate> 
         <DataTemplate TargetType="{x:Type local:Page3ViewModel}"> 
          <local:Page3View /> 
         </DataTemplate> 
        </ContentControl.Resources> 

       </ContentControl> 
      </StackPanel> 
     </DockPanel> 
    </Grid> 
</Window> 
+0

'IRegionManager.RequestNavigate()'メソッドを使って、NavigationをViewModelに簡単に移動する方法があります。私のアプリケーションでは、サービスに移動することさえできます:) – chopikadze

+0

@chopikadze前に 'RegionManager'を使用しようとしましたが、特にサブリージョンやアプリケーションの混乱のために嫌いでした。アプリケーションのさまざまな領域をレイアウトするのは素晴らしいと思いますが、それ以外の用途には使用しません。それはただ私です:) – Rachel

+0

私はこれを試し、実行時にSelectedPageの値をチェックしました。それは正しく設定されました。ただし、コンテンツコントロールは、ビューモデルに関連付けられたビューを表示しませんでした。テストのために、私はRibbonbarを変更せず、このメソッドを単一のビューに対して単純にテストしました。 –

1

内容:私はプリズムのフレームワークを使って好き

<Window ...> 
    <StackPanel> 
     <Grid> 
      <!-- Your shared content --> 
     </Grid> 
     <ContentControl prism:RegionManager.RegionName="MainRegion"/> 
    </StackPanel> 
</Window> 
+0

これは私がやったことですが、私はすでにシェルと4つのビューhaveはそれぞれMainRegionに注入されます。つまり、私はUserControl(MainRegionに注入される)に別の領域を作成できますが、このSubRegionにビューを挿入するためには、RibbonBarでこれらのサブビューを参照する必要がありますコントロール(これはシェルの別のリージョンにあります)。私は質問を明確にするように更新します。 –

関連する問題