我有一个带有四个按钮的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设计),但我想知道是否有更好,更优雅的方法来做到这一点。
答案 0 :(得分:2)
我喜欢使用Prism框架,但是我觉得他们的区域应该仅用于应用程序布局(MenuRegion
,NavigationRegion
,ContentRegion
等),而不是导航。将它们用于导航意味着让View控制应用程序流,我觉得这是ViewModel的工作。
我显示更改内容的首选方法是使用DataTemplates和ContentControls
要创建类似于您概述的内容,我将拥有一个包含
的父ViewModelObservableCollection<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>