Есть ли способ остановить закрытие меню при нажатии на него?

У нас есть форма в нашей программе, которая позволяет пользователю определить, что пользователь видит при настройке привилегий, используя строку меню. Когда пользователь нажимает на элемент, этот элемент затем "выбирается" (рядом с ним стоит галочка). Тем не менее, это также закрывает меню.

Есть ли способ остановить закрытие этого меню (не затрагивая другие меню в программе), когда пользователь нажимает на него? Пока что я не нашел ничего в настройках, и ни одного _click методы тоже не влияют на это.

3 ответа

Прослушайте ToolStripDropDownClosingEventHandler, представленный в ToolStripDropDown. Для этого просто обратитесь к свойству ToolStripMenuItem.DropDown и добавьте прослушиватель, который будет обрабатывать событие Closing. Нам просто нужно проверить, находится ли указатель мыши внутри прямоугольника toolStrip, и это можно сделать с помощью этого фрагмента кода:

private void ListenToolStripMenuItems(IEnumerable<ToolStripMenuItem> menuItems)
{
    // listen all menuItems
    foreach (ToolStrip menuItem in menuItems)
        menuItem.DropDown.Closing += OnToolStripDropDownClosing;
}

private void OnToolStripDropDownClosing(object sender, ToolStripDropDownClosingEventArgs e)
{
        var tsdd = sender as ToolStripDropDown;      // casting

        // checking if mouse it's inside
        Point p = tsdd.PointToClient(MousePosition);  
        if (tsdd.DisplayRectangle.Contains(p))
            e.Cancel = true;  // cancel closing
}

Таким образом, AutoClose все еще работает, и toolStrip закроется правильно.

Я взломщик, но я бы сделал это для каждого элемента, который вы можете нажать:

 sampleNameToolStripMenuItem.ShowDropDown();

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

У меня была аналогичная проблема. В моем случае проверяемые элементы были на уровень ниже.

Я решил это, добавив события MouseEnter и MouseLeave в ToolStripMenuItems, которые можно отмечать / снимать.

В MouseEnter я установил для AutoClose обоих menuItem значение false - в MouseLeave я установил для него значение true.

Визуализация проблемы, которая у меня была

 private void AddEventToToolStripMenuItems(IEnumerable<ToolStripMenuItem> menuItems)
        {
            // listen all menuItems
            foreach (ToolStripMenuItem menuItem in menuItems)
            {
                menuItem.MouseEnter += OnToolStripMouseEnter;
                menuItem.MouseLeave += OnToolStripMouseLeave;
            }
        }

       private void OnToolStripMouseEnter(object sender, EventArgs e)
        {
            firstLevelTooStipMenuItem.DropDown.AutoClose = false;
            secondLevelTooStipMenuItem.DropDown.AutoClose = false;
        }

        private void OnToolStripMouseLeave(object sender, EventArgs e)
        {
            firstLevelTooStipMenuItem.DropDown.AutoClose = true;
            secondLevelTooStipMenuItem.DropDown.AutoClose = true;
        }
  1. Получить ToolStripMenuItem

  2. Получить DropDown от ToolStripMenuItem

  3. Задавать AutoClose как false

Ref:

https://msdn.microsoft.com/en-us/library/system.windows.forms.toolstripmenuitem(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/system.windows.forms.toolstripdropdown(v=vs.110).aspx

Другие вопросы по тегам