【发布时间】:2023-03-25 16:54:01
【问题描述】:
我们正在 PRISM 和大量模块的帮助下实施模块化软件。该框架包含 MainWindow Shell,其中定义了工具栏和菜单。每个模块都应该能够在运行时添加自己的工具栏和菜单条目,例如初始化。为此,使用了区域管理器。对于工具栏,它运行良好,但对于菜单,出现了一些问题:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<!--
<Menu Grid.Row="0" IsMainMenu="True">
<MenuItem Header="Test" />
</Menu>
-->
<!-- Main Menu -->
<StackPanel Grid.Row="0" Orientation="Horizontal">
<ItemsControl Name="MainMenuRegion" prism:RegionManager.RegionName="{x:Static common:RegionNames.MainMenu}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<ItemsControl Name="AppMenuRegion" prism:RegionManager.RegionName="{x:Static common:RegionNames.AppMenu}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<ItemsControl Name="HelpMenuRegion" prism:RegionManager.RegionName="{x:Static common:RegionNames.HelpMenu}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</StackPanel>
.....
区域RegionNames.MainMenu 用于常见条目,如文件、编辑、视图。区域RegionNames.AppMenu 是为几个模块添加自己的菜单。区域RegionNames.HelpMenu 用于常用条目窗口和帮助。使用区域的动机是为了获得菜单条目的顺序。每个模块以这种方式为菜单创建自己的视图(用户控件)和视图模型:
<Menu ItemsSource="{Binding MainMenuItems}" />
对于我们正在使用数据模板的菜单项:
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding Command}" />
<Setter Property="CommandParameter" Value="{Binding CommandParameter}" />
<Setter Property="Header" Value="{Binding Text, UpdateSourceTrigger=PropertyChanged}" />
<Setter Property="IsChecked" Value="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}" />
<Setter Property="IsEnabled" Value="{Binding IsEnabled, UpdateSourceTrigger=PropertyChanged}" />
<Setter Property="Visibility" Value="{Binding IsVisible, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource VisibilityConverter}}" />
<Setter Property="ItemsSource" Value="{Binding Children, UpdateSourceTrigger=PropertyChanged}" />
<Setter Property="Icon" Value="{DynamicResource itemIcon}" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsSeparator, UpdateSourceTrigger=PropertyChanged}" Value="true">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Separator />
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Icon}" Value="{x:Null}">
<Setter Property="Icon" Value="{x:Null}" />
</DataTrigger>
</Style.Triggers>
</Style>
但是这种方法行不通。当尝试在两个不同的区域注册相同的视图时:
IRegionViewRegistry regionViewRegistry = ServiceLocator.Current.GetInstance<IRegionViewRegistry>();
regionViewRegistry.RegisterViewWithRegion(RegionNames.HelpMenu, typeof(MainMenu));
regionViewRegistry.RegisterViewWithRegion(RegionNames.MainMenu, typeof(MainMenu));
只有最后一个区域(MainMenu 区域)会获得菜单条目。同样的行为出现在两个不同的视图中。似乎最后一个覆盖了第一个。
我搜索了合适的解决方案,但不幸的是直到现在我还没有找到适合这个用例的解决方案。希望我能以这种方式找到解决此问题的解决方案或另一种方法。提前致谢。
【问题讨论】: