Как предотвратить закрытие контекстного меню WP7 после выбора элемента? - PullRequest
1 голос
/ 03 января 2012

Я подключил пункт контекстного меню в элементе списка, чтобы при его нажатии изменилось его состояние. Мне нужно, чтобы меню оставалось открытым после выбора элемента, или чтобы программно открыть меню сразу после его закрытия.

Мое меню выглядит так:

Some Command 1
Some Command 2
Some Command 3
Inverted

И пользователь может нажать команду Inverted, а затем нажать одну из других команд, чтобы заставить их работать в инвертированном режиме, и меню через привязку данных выглядит так:

Some Command 1
Some Command 2
Some Command 3
Inverted ✔ 

Не имея возможности выяснить, как сохранить меню открытым после нажатия, я попробовал менее идеальный подход к открытию меню, например:

private void onCommandInvert(object sender, RoutedEventArgs e)
{
  CommandState.Instance.Inverted = !CommandState.Instance.Inverted;

  // Open it again.
  MenuItem menuItem = (MenuItem)sender;
  ContextMenu menu = (ContextMenu)menuItem.Parent;
  menu.IsOpen = true;
}

Но при этом выдается следующее исключение в операторе menu.IsOpen = true:

A first chance exception of type 'System.InvalidOperationException' occurred in 
  System.Windows.dll

An unhandled exception of type 'System.InvalidOperationException' occurred in 
  System.Windows.dll

Additional information: Element is already the child of another element.

Я также попробовал следующее с событием Closed, с тем же самым исключением:

private void onContextMenuClosed(object sender, RoutedEventArgs e)
{
  ContextMenu menu = (ContextMenu)sender;
  menu.IsOpen = true;
}

Есть идеи? Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 января 2012

Если вы хотите сохранить меню после того, как пользователь выбрал элемент, то я считаю, что элемент управления контекстного меню - это не то, что вы должны использовать.

Лучше создать собственный пользовательский элемент управления, чтобы имитировать поведение и располагать его соответствующим образом на экране, где оно имеет смысл (в сторону или выше / ниже)

В качестве альтернативы, если эти параметры должны быть приняты для выбранных элементов, рассмотрите возможность использования значков / элементов меню панели приложения и напишите код события, чтобы прочитать текущее выбранное значение элемента списка.

Надеюсь, это поможет.

0 голосов
/ 03 января 2012

Я понял!Благодаря комментарию Уилмела я перебрал исходный код MenuItem и смог переопределить OnClick(), чтобы сделать именно то, что мне нужно (без сомнения, идеальное решение).Однако я не смог получить доступ к Click, поэтому мне нужно было также ввести свойство события StayClick.

Наслаждайтесь!

using Microsoft.Phone.Controls;
using System.Windows;

namespace MyNamespace
{
  public class MenuItemEx : MenuItem
  {
    public bool StayOpenWhenClicked
    {
      get;
      set;
    }

    public event RoutedEventHandler StayClick;

    protected override void OnClick()
    {
      if (StayOpenWhenClicked)
      {
        if (StayClick != null)
        {
          StayClick.Invoke(this, new RoutedEventArgs());
        }
      }
      else
      {
        base.OnClick();
      }
    }
  }
}

и в xaml страницы вместо toolkit:MenuItem вы используете my:MenuItemEx

<my:MenuItemEx 
  Header="Inverted"             
  StayClick="onCommandInvert"
  StayOpenWhenClicked="True"
/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...