.NET MenuItem.IsSubmenuOpen = true仅在第一次有效

时间:2011-11-23 00:44:20

标签: c# .net contextmenu submenu

我有一个ContextMenu,其中包含一些子菜单,这些子菜单包含可以选择的项目(MenuItem)。打开ContextMenu时,我想以递归方式打开当前选定的项目。所以,我有以下代码:

    protected override void OnOpened( RoutedEventArgs e ) {
        base.OnOpened( e );
        OpenCurrentSubMenu( Items );
    }

    private static bool OpenCurrentSubMenu( ItemCollection itemCollection ) {
        foreach (MenuItem item in itemCollection) {
            if (item.IsChecked) {
                return true;
            }
            else if( OpenCurrentSubMenu( item.Items ) ) {
                item.IsSubmenuOpen = true;
                return true;
            }
        }
        return false;
    }

我还有一些其他代码可以确保只检查一个项目。

这在我第一次选择子菜单中的项目时效果很好。当我重新打开ContextMenu时,打开的子菜单会级联打开到所选项目:

First Drop-down

但是,当我离开上下文菜单并再次重新打开时,所选菜单不会打开:

Next Drop-down

有谁知道为什么以及如何解决它?

3 个答案:

答案 0 :(得分:3)

尝试三件事:

  • 打开上下文菜单时,在尝试打开任何子菜单之前,递归整个层次结构并设置IsSubmenuOpen = false。可能是因为先前打开的子菜单被记住了,因此您试图告诉它在同一级别有两个打开的子菜单。

  • 递归查找需要打开的子菜单并将其存储在列表中。然后遍历列表并设置它们,以便在其子子菜单设置为打开之前将最顶层的菜单设置为打开。 (可能是在父母尚未开放的情况下试图打开孩子并不总能可靠地工作)。

  • 令人讨厌的蛮力方法:每次打开时删除并重新创建上下文菜单。这不好,但是如果你打开一个上下文菜单,你可能会担心性能影响。并且它似乎第一次起作用,所以每次都是第一次。

答案 1 :(得分:1)

在将值设置回false之前,将值设置为true可能会有所帮助。我不能证实这一点。

item.IsSubmenuOpen = false;
item.IsSubmenuOpen = true;

答案 2 :(得分:0)

我认为逻辑应该很好...当菜单项被选中时,但是当选中子菜单项时则不行。 在我看来,尝试两个循环....一个用于菜单,另一个用于子菜单项。