2016-09-19 3 views
0

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.

Antwort

0
IRegionViewRegistry regionViewRegistry = ServiceLocator.Current.GetInstance<IRegionViewRegistry>(); 
regionViewRegistry.RegisterViewWithRegion(RegionNames.HelpMenu, typeof(MainMenu)); // registering same view with diferent region 
regionViewRegistry.RegisterViewWithRegion(RegionNames.MainMenu, typeof(MainMenu)); 

Wenn ich rechts, dann verstehen Sie definieren 3 Regionen (ein Platzhalter in dem Sie benutzerdefinierte Benutzersteuerung in Ihrem Fall hinzufügen kann, ist Menüpunkt.)

1) RegionNames.HelpMenu

2) RegionNames . AppMenu

3) RegionNames.MainMenu

Jetzt müssen Sie 3 individuelle Benutzerverwaltung erstellen und diese mit der Region registrieren.

public partial class MainMenuSelection : UserControl 
    { 
     public MainMenuSelection() 
     { 
     InitializeComponent(); 
     } 
    } 

Ebenso für App-Menü und Hilfemenü bzw.

Und dann können Sie wie

ServiceLocator.Current.GetInstance<IRegionViewRegistry>(); 
regionViewRegistry.RegisterViewWithRegion(RegionNames.HelpMenu,typeof(HelpMenuSelection)); 
regionViewRegistry.RegisterViewWithRegion(RegionNames.MainMenu, typeof(MainMenuSelection)); // You are registering view (mainmenuselection) with unique region placeholder(RegionNames.MainMenu) 
+0

es funktioniert jetzt, .... – user6849514

0

Vielen Dank für Ihre Antwort verwenden. Aber ich mache das auf diese Weise, die Sie beschrieben

IRegionViewRegistry regionViewRegistry = ServiceLocator.Current.GetInstance<IRegionViewRegistry>(); 
    regionViewRegistry.RegisterViewWithRegion(RegionNames.MainMenu, typeof(MainMenu)); 
    regionViewRegistry.RegisterViewWithRegion(RegionNames.HelpMenu, typeof(HelpMenu)); 

und z. ein Usercontrol für den Menüpunkt

<UserControl x:Class="XXX.GUI.View.MainMenu" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     d:DesignHeight="300" 
     d:DesignWidth="300" 
     mc:Ignorable="d"> 

    <MenuItem ItemsSource="{Binding MainMenuItems}" /> 
</UserControl> 

In meinem Viewmodel die beobachtbaren Sammlung für MainMenuItems erstellt. Wenn ich das auf diese Weise mache, ist das MenuItem nicht auf oberster Ebene sondern auf zweiter Ebene und es ist nicht möglich, das Hilfemenü in den Hilfe-Menübereich zu injizieren.

Verwandte Themen