我有一个带有四个按钮的RibbonBar,每个按钮选择一个不同的 View 并将其注入(inject)MainRegion。目前,它运作良好,但是四个 View 中的每个 View 都有一些共同的控件,例如显示用户名,日期/时间,搜索框等。到目前为止,我已经进行了单独的查看,但是我想知道是否存在一种实现母版页/用户控件的方法,这样我就不必重复代码。

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

shell

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

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

每个Button将向MainRegion中注入(inject)一个 View 。这些 View 中的每一个都有一些共同的控件(非常类似于ASP.Net中的母版页),但是每个 View 的内容是不同的。

有多种方法可以解决此问题(我无法更改Shell设计),但我想知道是否有更好,更优雅的方法可以做到这一点。

最佳答案

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

我显示更改内容的首选方法是使用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>
    

    关于wpf - 母版页,但地区?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8728807/

    10-13 01:04