0

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

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

<Menu ItemsSource="{Binding MainMenu}">
</Menu>

我的视图模型类目前看起来像这样:

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;
    }
}

StartupShellMenu.xaml 文件如下所示:

<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,但没有任何变化。有什么想法吗?我确定我错过了一些明显的愚蠢的东西,但我在搜索中找不到任何有用的东西。

提前致谢!

4

1 回答 1

0

对我来说,这感觉就像 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 中拉出它,因为那里不需要它。

无需将 Menu 放入 XAML 并绑定到 MainMenu,只需将新的 StartupShellMenu 类直接添加到 XAML 中即可。

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

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

于 2012-04-05T04:40:44.417 回答