Warm tip: This article is reproduced from serverfault.com, please click

c#-.NET MenuItem.IsSubmenuOpen = true 仅在第一次工作

(c# - .NET MenuItem.IsSubmenuOpen = true only works the first time)

发布于 2011-11-23 00:44:19

我有一个 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 时,打开的子菜单级联打开到所选项目:

第一个下拉菜单

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

下一个下拉菜单

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

Questioner
DiamondBack
Viewed
0
Jason Williams 2011-11-23 23:40:05

尝试三件事:

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

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

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