在WPF中,如何从资源加载菜单?

在WPF中,如何从资源加载菜单?,wpf,resources,menu,Wpf,Resources,Menu,在问这个问题之前,我花了很多时间浏览了StackOverflow和Google,没有找到任何非常有用的东西。我正在寻找如何从编译的Xaml文件加载菜单并将其附加到菜单控件的指南。我是WPF的新手,所以请容忍我 在我的页面中,我有以下Xaml: <Menu ItemsSource="{Binding MainMenu}"> </Menu> StartupShellMenu.xaml文件如下所示: public class MainWindowViewModel : Vie

在问这个问题之前,我花了很多时间浏览了StackOverflow和Google,没有找到任何非常有用的东西。我正在寻找如何从编译的Xaml文件加载菜单并将其附加到菜单控件的指南。我是WPF的新手,所以请容忍我

在我的页面中,我有以下Xaml:

<Menu ItemsSource="{Binding MainMenu}">
</Menu>
StartupShellMenu.xaml文件如下所示:

public class MainWindowViewModel : ViewModelBase
{
    public ItemCollection MainMenu { get; set; }

    public MainWindowViewModel()
    {
        Menu m = (Menu)Application.LoadComponent(new Uri("/Assets/Menus/StartupShellMenu.xaml", UriKind.Relative));
        MainMenu = m.Items;
    }
}
<Menu xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <MenuItem Header="_File">
        <MenuItem Header="_Open">
            <MenuItem.Icon>
                <Image Height="16" Width="16" Source="/Assets/Icons/Open.png"/>
            </MenuItem.Icon>
        </MenuItem>
        <Separator/>
        <MenuItem Header="E_xit"/>
    </MenuItem>
</Menu>

我看到的是我的菜单项出现了,但是当我的鼠标离开菜单时(我不必点击),菜单就消失了。另外,正常的键盘功能也不起作用;按Alt+F键不显示菜单,显示后,向上/向下键不起作用。我尝试将MainMenu属性的类型更改为ObservableCollection,但没有更改。有什么想法吗?我肯定我遗漏了一些显而易见的愚蠢的东西,但我在搜索中找不到任何有用的东西


提前谢谢

对我来说,这感觉像是100%的视图,而ViewModel可能不应该参与其中

为什么要使用ViewModel进行此操作?您真的允许在运行时更改菜单,使其成为动态菜单吗

如果没有,则在StartupShellMenu.xaml文件中为类指定一个类名,然后加载它

<Menu x:Class="StartupShellMenu"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <MenuItem Header="_File">
        <MenuItem Header="_Open">
            <MenuItem.Icon>
                <Image Height="16" Width="16" Source="/Assets/Icons/Open.png"/>
            </MenuItem.Icon>
        </MenuItem>
        <Separator/>
        <MenuItem Header="E_xit"/>
    </MenuItem>
</Menu>

然后将其从ViewModel中拉出,因为那里不需要它

不要在XAML中添加菜单并绑定到MainMenu,只需直接在XAML中添加新的StartupShellMenu类即可

<local:StartupShellMenu ItemsSource="{Binding MainMenu}" />


如果菜单仅存在于视图中,请将所有菜单代码100%保留在视图中。

事实上,我想我已经得到了它。不过,非常感谢您的回复。是的,我的计划是拥有一组动态菜单,这些菜单在上下文中显示,就像VisualStudio菜单的工作方式一样。事实证明,您不能直接将菜单项从一个菜单加载到另一个菜单,这基本上就是我所做的。如果你仔细想想,这是有道理的,因为所有权是有问题的。我需要使用HierarchycalDataTemplate对象和ContentPresenter。再次感谢。我相信你花了这么长时间才做出回应。非常感谢。