我有一个带有四个按钮的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框架,但是我觉得它们的区域仅应用于应用程序布局(MenuRegion
,NavigationRegion
,ContentRegion
等),而不应用于导航。将它们用于导航意味着让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/