我有一个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时,打开的子菜单会级联打开到所选项目:
但是,当我离开上下文菜单并再次重新打开时,所选菜单不会打开:
有谁知道为什么以及如何解决它?
答案 0 :(得分:3)
尝试三件事:
打开上下文菜单时,在尝试打开任何子菜单之前,递归整个层次结构并设置IsSubmenuOpen = false。可能是因为先前打开的子菜单被记住了,因此您试图告诉它在同一级别有两个打开的子菜单。
递归查找需要打开的子菜单并将其存储在列表中。然后遍历列表并设置它们,以便在其子子菜单设置为打开之前将最顶层的菜单设置为打开。 (可能是在父母尚未开放的情况下试图打开孩子并不总能可靠地工作)。
令人讨厌的蛮力方法:每次打开时删除并重新创建上下文菜单。这不好,但是如果你打开一个上下文菜单,你可能会担心性能影响。并且它似乎第一次起作用,所以每次都是第一次。
答案 1 :(得分:1)
在将值设置回false
之前,将值设置为true
可能会有所帮助。我不能证实这一点。
item.IsSubmenuOpen = false;
item.IsSubmenuOpen = true;
答案 2 :(得分:0)
我认为逻辑应该很好...当菜单项被选中时,但是当选中子菜单项时则不行。 在我看来,尝试两个循环....一个用于菜单,另一个用于子菜单项。