从模块向 Shell 添加菜单项

问题描述

我的 shell 有一个 Menu,它定义了一个 MenuRegionMenu一个 ItemsControl,因此它可以包含 MenuItem(当然)。

我尝试在包含 UserControl 的模块中创建视图 (MenuItem) 并将它们添加MenuRegion 中,例如

regionManager.Regions["MenuRegion"].Add(theUserControlContainingMenuItems)

但这会在幕后创建另一个 Menu 实例,从而产生问题。

推荐的方法是什么?

解决方法

问题在于您创建和 UserControlMenu 而不是 MenuItem。对于所有 ItemsControl 都是相同的行为,如果您添加的项目不是该特定控件的容器类型(例如 ListViewItem 中的 ListView),则该项目将是自动包装在容器中。

让我们假设,您已经像这样定义了菜单区域。

<Menu DockPanel.Dock="Top" prism:RegionManager.RegionName="{x:Static regions:RegionNames.Menu}"/>

因为 Visual Studio 不提供模板来添加新的 MenuItem、创建 UserControl 以及像这样更改 XAML 和代码隐藏文件的内容。

FileMenuItem.xaml.cs 的内容:

<MenuItem x:Class="Example.FileMenuItem"
          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"
          xmlns:prism="http://prismlibrary.com/"
          prism:ViewModelLocator.AutoWireViewModel="True"
          mc:Ignorable="d"
          Header="File">
   <MenuItem Header="New"/>
   <MenuItem Header="Open"/>
   <MenuItem Header="Save"/>
</MenuItem>

FileMenuItem.cs 的内容:

using System.Windows.Controls;

namespace Example
{
   public partial class FileMenuItem : MenuItem
   {
      static FileMenuItem()
      {
      }

      public FileMenuItem()
      {
         InitializeComponent();
      }
   }
}

为您的每个菜单项创建这些文件,以下内容将起作用。

regionManager.Regions["MenuRegion"].Add(new FileMenuItem());