2011-11-23 31 views
0

我有一个ContextMenu,其中包含一些可以选择项目(MenuItem)的子菜单。当ContextMenu打开时,我想递归地打开当前选择的项目。所以,我有以下代码:.NET MenuItem.IsSubmenuOpen = true仅在第一次生效

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

我也有一些其他代码,以确保只有一个项目被检查。

这在第一次在子菜单中选择一个项目时似乎很有效。当我再次打开文本菜单,打开子菜单级联打开所选项目:

First Drop-down

然而,当我离开上下文菜单,然后重新打开它第二次,所选择的菜单不开:

Next Drop-down

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

+0

您的标题显示“IsItemChecked”,但您的代码显示“IsSubmenuOpen”。 –

+0

@ScottRippey - 已更新。谢谢。 – DiamondBack

+0

你能用更多级别的菜单测试吗?每次重新开放会导致重新开放一个级别还是一直不打开最终菜单? –

回答

3

三件事尝试:

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

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

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

+0

好的提示。我尝试了几个变化:我尝试了Scott Rippey的方法。我也尝试在关闭时设置IsSubmenuOpen = false,无济于事。你的第二个子弹很有趣,但并没有解释为什么第一次级联工作,但没有解释以下时间。蛮力始终是一种选择:) – DiamondBack

+0

似乎第二个选择的伎俩,但它仍不能解释为什么第一次级联工作。 !@ * $#MS .NET – DiamondBack

+1

很可能某些信息在第一次尝试时未被缓存,因此无论您设置菜单的哪个顺序打开,但随后尝试菜单系统“知道更多”的关于层次结构或状态现有的菜单项,并因此而被您尝试改变事物所困惑。 –

1

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

item.IsSubmenuOpen = false; 
item.IsSubmenuOpen = true; 
+0

感谢您的提示,斯科特。我以前看过类似的.NET解决方案,看起来很有希望。不幸的是,在这种情况下它不起作用。 – DiamondBack

0

我认为逻辑应该很好地工作......当菜单项被选中,而不是子菜单项被选中时。 在我看来尝试两个循环....一个菜单和另一个子菜单项。