Заставить контекстное меню игнорировать щелчок правой кнопкой мыши, когда пользователь выбирает пункт контекстного меню - PullRequest
0 голосов
/ 18 июня 2019

Я определил контекстное меню ContextMenuStrip в IDE Visual Studio C # и закодировал программу так, чтобы контекстное меню успешно всплывало, когда пользователь щелкает правой кнопкой мыши объект на экране.Пользователь может выбрать элемент из контекстного меню, и код успешно определяет, какой элемент контекстного меню был выбран пользователем.Все идет нормально.Проблема в том, что контекстное меню принимает щелчок правой кнопкой мыши в качестве механизма выбора пункта контекстного меню.Я заметил это, когда я случайно щелкнул правой кнопкой мыши по объекту на экране ... Меню появилось с первым щелчком мыши, и немедленный второй щелчок в итоге выбрал пункт контекстного меню, который оказался закрашенным под курсором мыши.

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

Вот команда, которая отображает контекстное меню:

ctxMenu.Show(this, pt);

, где «this» - это форма, а «pt» - это точка в форме, где была нажата мышь.

А вот фрагмент кода, который срабатывает при выборе элемента контекстного меню:

private void ctxMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
  // Make context menu go away
  ctxMenu.Hide();
  switch (e.ClickedItem.Text)
  {
    case "blah blah blah"
    ...
    break;
  }
}

Контекстные меню в продуктах Microsoft Office, таких как Word и Excel, игнорируют щелчки правой кнопкой мыши, даже для отображения подменю.Есть ли способ заставить C # ContextMenuStrip игнорировать щелчки правой кнопкой мыши тоже?

1 Ответ

0 голосов
/ 19 июня 2019

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

  1. Добавьте свойство bool к классу формы, например:

    private bool retryContextMenu = false;

  2. Добавьте обработчик события MouseClick к форме, например:

    private void ctxMenu_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) retryContextMenu = true; else retryContextMenu = false; }

Обратите внимание, что событие MouseClick вызывается до события ItemClicked, а MouseClick позволяет определить, какая кнопка мыши была нажата.

  1. Установите для свойства ContextMenuStrip AutoClose значение FALSE. Когда для него было установлено значение по умолчанию true, я не мог предотвратить закрытие меню. Даже добавив условный вызов ctxMenu.Show() в закрытом событии меню не оставалось видимым.

  2. Добавить метод, чтобы закрыть контекстное меню и сбросить флаг, например:

    private void CancelPopup() { if (ctxMenu.Visible) ctxMenu.Close(); retryContextMenu = false; }

В моем случае я добавил вызовы к CancelPopup () во все методы, которые запускаются пользовательскими щелчками мыши любого типа.

  1. Измените ранее показанный обработчик события ItemClicked на:

    private void ctxMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { if (retryContextMenu) return; // If not a valid user click, don't process CancelPopup(); // Make context menu go away switch (e.ClickedItem.Text) { case "blah blah blah": ... break; ... } }

...