1

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

第一个下拉菜单

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

下一个下拉菜单

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

4

4 回答 4

3

尝试三件事:

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

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

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

于 2011-11-23T15:40:05.293 回答
1

false在将其设置回 之前将值设置为 可能会有所帮助true。我无法确认这一点。

item.IsSubmenuOpen = false;
item.IsSubmenuOpen = true;
于 2011-11-23T01:11:49.053 回答
0

我认为逻辑应该很好......当检查菜单项时,而不是检查子菜单项时。在我看来,尝试两个循环....一个用于菜单,另一个用于子菜单项。

于 2011-11-23T01:26:47.917 回答
0

没有一个解决方案对我有效/清晰,而且没有一个看起来很优雅。我发现了一些有用的东西。

试试这个:

    public partial class WindowWithContextMenu : Window
    {

        // Add this Show method
        public new void Show()
        {
            base.Show();
            base.Activate();

            // Do this for any context menu!
            MyContextMenu.IsSubmenuOpen = true;
            MyContextMenu.IsSubmenuOpen = false;

            MyContextMenu2.IsSubmenuOpen = true;
            MyContextMenu2.IsSubmenuOpen = false;

            // And so on
        }

        ... 
        ...

    }

这种方式你修改了一下原来Show()的窗口方法。现在,当您调用该Show()方法时,它将运行这个小技巧。

然后在某个时候,您可以单击打开菜单的某个按钮。问题是,这一次它将永远有效,而不仅仅是第一次!

MyContextMenu并且MyContextMenu2在 XAML 文件中定义,默认情况下它们不会在 XAML 文件中打开。

我不知道为什么这有效,但确实有效。它很丑陋,但黑客很简单,而且是一种复制粘贴解决方案......

我还发现,为了重现该问题,您需要锁定帐户并重新登录。每次我这样做时,它都会重现 100%。

于 2021-10-20T20:50:08.983 回答