我有一个 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 时,打开的子菜单级联打开到所选项目:
但是,当我离开上下文菜单并再次打开它时,所选菜单不会打开:
有谁知道为什么以及如何解决它?
尝试三件事:
打开上下文菜单时,在尝试打开任何子菜单之前递归整个层次结构并设置 IsSubmenuOpen = false。可能是之前打开的子菜单被记住了,因此你想告诉它在同一级别有两个打开的子菜单。
递归查找需要打开的子菜单并将它们存储在列表中。然后遍历列表并设置它们,以便在其子子菜单设置为打开之前将最顶层的菜单设置为打开。(可能是在其父级尚未打开时尝试打开子级并不总是可靠地工作)。
讨厌的蛮力方法:每次打开上下文菜单时删除并重新创建它。这不好,但如果你打开上下文菜单,你可能会担心性能影响。而且它似乎是第一次工作,所以每次都是第一次。
很好的提示。我尝试了几种变体:我尝试了 Scott Rippey 的方法。我还尝试在关闭时设置 IsSubmenuOpen = false,但无济于事。您的第二个项目符号很有趣,但没有解释为什么第一次级联起作用,但以下几次都没有。蛮力总是一种选择:)
似乎第二个选项可以解决问题,尽管它仍然没有解释为什么级联第一次起作用。!@*$# MS .NET
某些信息可能在第一次尝试时未缓存,因此无论您设置菜单打开的顺序如何,它都可以工作,但在随后的尝试中,菜单系统“更了解”现有菜单项的层次结构或状态,因此会被你改变事物的尝试。