Есть ли способ остановить закрытие меню при нажатии на него?
У нас есть форма в нашей программе, которая позволяет пользователю определить, что пользователь видит при настройке привилегий, используя строку меню. Когда пользователь нажимает на элемент, этот элемент затем "выбирается" (рядом с ним стоит галочка). Тем не менее, это также закрывает меню.
Есть ли способ остановить закрытие этого меню (не затрагивая другие меню в программе), когда пользователь нажимает на него? Пока что я не нашел ничего в настройках, и ни одного _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;
}
Получить
ToolStripMenuItem
Получить
DropDown
отToolStripMenuItem
Задавать
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