主页但是对于区域?

时间:2012-01-04 14:52:19

标签: wpf mvvm prism

我有一个带有四个按钮的RibbonBar,每个按钮选择一个不同的视图并将其注入MainRegion。现在,它运作良好,但四个视图中的每一个都有一些共同的控件,例如:显示用户名,日期/时间,搜索框等。截至目前,我已经制作了单独的视图,但我想知道是否有一种实现Master Page / UserControl的方法,这样我就不必重复代码了

所以现在的设计是这样的:

Shell

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

ToolbarRegion包含带有四个按钮的RibbonBar。

每个Button都会将视图注入MainRegion。这些视图中的每一个都有一些共同的控件(很像ASP.Net中的母版页),但每个视图的内容都不同。

有很多方法可以解决这个问题(我不能改变Shell设计),但我想知道是否有更好,更优雅的方法来做到这一点。

2 个答案:

答案 0 :(得分:2)

我喜欢使用Prism框架,但是我觉得他们的区域应该仅用于应用程序布局(MenuRegionNavigationRegionContentRegion等),而不是导航。将它们用于导航意味着让View控制应用程序流,我觉得这是ViewModel的工作。

我显示更改内容的首选方法是使用DataTemplates和ContentControls

要创建类似于您概述的内容,我将拥有一个包含

的父ViewModel
  • ObservableCollection<IPageViewModel> PageViewModels
  • IPageViewModel SelectedPageViewModel

我想要显示动态内容的区域将使用ContentControl,例如:

<ContentControl Content="{Binding SelectedPage" />

DataTemplates将用于告诉WPF如何绘制每个部分

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

之前我没有使用过RibbonBar,但听起来它应该允许一个ItemsSource,所以你的最终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>

答案 1 :(得分:1)

Shell.xaml的内容:

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