.NET MenuItem.IsSubmenuOpen = true работает только в первый раз - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть 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, каскад открытых подменю открывается для выбранного элемента:

First Drop-down

Однако, когда я покидаю контекстное меню и повторно открываю его, выбранное меню НЕ открывается:

Next Drop-down

Кто-нибудь знает почему и как это исправить?

Ответы [ 3 ]

3 голосов
/ 23 ноября 2011

Три вещи, чтобы попробовать:

  • Когда открыто контекстное меню, выполните повторение по всей иерархии и задайте IsSubmenuOpen = false, прежде чем пытаться открыть любое подменю. Может случиться так, что ранее открытое подменю запоминается, и поэтому вы пытаетесь сказать ему, чтобы было два открытых подменю на одном уровне.

  • Повторно найдите подменю, которые необходимо открыть, и сохраните их в списке. Затем выполните итерацию по списку и установите их так, чтобы открылось самое верхнее меню, прежде чем открылось его дочернее подменю. (Может случиться так, что попытка открыть ребенка, когда его родитель еще не открыт, не всегда будет работать надежно).

  • Противный подход грубой силы: удалять и пересоздавать контекстное меню каждый раз, когда оно открывается. Это нехорошо, но если вы открываете контекстное меню, вы, вероятно, будете беспокоиться о влиянии на производительность. И кажется, что это работает в первый раз, так что делайте каждый раз в первый раз.

1 голос
/ 23 ноября 2011

Может помочь установить значение на false, прежде чем вернуть его на true.Я не могу подтвердить это, хотя.

item.IsSubmenuOpen = false;
item.IsSubmenuOpen = true;
0 голосов
/ 23 ноября 2011

Я думаю, что логика должна работать хорошо ... когда проверяется пункт меню, но не когда проверяется пункт подменю. На мой взгляд, попробуйте две петли .... один для меню, а другой для пунктов подменю.

...