Wir implementieren eine modulare Software mit Hilfe von PRISM und einer großen Anzahl von Modulen. Das Framework enthält die MainWindow Shell, in der unter anderem die Symbolleiste und das Menü definiert sind. Jedes Modul sollte in der Lage sein, während der Laufzeit eigene Symbolleisten- und Menüeinträge hinzuzufügen, wenn das Modul z. initialisiert. Dazu wird der Regionsmanager verwendet. Für die Symbolleiste ist es gut funktioniert, aber für das Menü einige Probleme auftreten:Microsoft PRISM: Verwenden mehrerer Regionen in einem WPF-Menü Steuerelement
<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>
.....
Die Region RegionNames.MainMenu
ist für die gemeinsamen Einträge wie Datei, Bearbeiten, Veiw. Die Region RegionNames.AppMenu
ist für die verschiedenen Module, um ihr eigenes Menü hinzuzufügen. Die Region RegionNames.HelpMenu
ist für die gemeinsamen Einträge Fenster und Hilfe. Die Motivation für die Verwendung der Regionen besteht darin, eine Bestellung für die Menüeinträge zu erhalten. Jedes Modul erstellt eine eigene Ansicht (Benutzerkontrolle) und View-Modell für das Menü auf diese Weise:
<Menu ItemsSource="{Binding MainMenuItems}" />
Des Weiteren für die Menüelemente verwenden wir eine Datenvorlage:
<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>
Aber dieser Ansatz doesn arbeite nicht. Beim Versuch, die gleiche Ansicht in zwei verschiedenen Regionen wie folgt zu registrieren:
IRegionViewRegistry regionViewRegistry = ServiceLocator.Current.GetInstance<IRegionViewRegistry>();
regionViewRegistry.RegisterViewWithRegion(RegionNames.HelpMenu, typeof(MainMenu));
regionViewRegistry.RegisterViewWithRegion(RegionNames.MainMenu, typeof(MainMenu));
nur die letzte Region (MainMenu Regionen) werden die Menüeinträge bekommen. Das gleiche Verhalten ist im Fall von zwei verschiedenen Ansichten. Es scheint, dass der letzte den ersten überschreibt.
Ich suchte nach geeigneten Lösungen, aber leider habe ich bis jetzt keinen für diesen Anwendungsfall gefunden. Hoffentlich werde ich auf diese Weise eine Lösung oder einen anderen Ansatz finden, um dieses Problem zu lösen. Danke im Voraus.
es funktioniert jetzt, .... – user6849514