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