问题描述
我的 shell 有一个 Menu
,它定义了一个 MenuRegion
。
Menu
是一个 ItemsControl
,因此它可以包含 MenuItem
(当然)。
我尝试在包含 UserControl
的模块中创建视图 (MenuItem
) 并将它们添加到 MenuRegion
中,例如
regionManager.Regions["MenuRegion"].Add(theUserControlContainingMenuItems)
但这会在幕后创建另一个 Menu
实例,从而产生问题。
推荐的方法是什么?
解决方法
问题在于您创建和 UserControl
到 Menu
而不是 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());