Как принудительно закрыть ContextMenu (проект WPF)? - PullRequest
5 голосов
/ 12 мая 2010

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

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

Спасибо!

Ответы [ 2 ]

16 голосов
/ 12 мая 2010

То, что вы хотите:

myContextMenu.IsOpen = false;

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

7 голосов
/ 12 мая 2010

Вы можете просто запустить длительную операцию в Dispatcher.BeginInvoke:

private void OnSomeContextMenuCommand(object sender, EventArgs e)
{
  Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
  {
    // Put long-running operation here
  }));
}

Если вы сделаете это, ContextMenu закроется, прежде чем начнется ваша длительная операция.

В целом, я предпочитаю, чтобы это решение явно закрывало ContextMenu, потому что оно полностью отделяет пользовательский интерфейс от обработки команд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...