Закрыть ToolStripMenuItem, когда мышь покидает ToolStripMenuItems
Я новичок в Windows Forms, поэтому мне интересно, каков наилучший подход к моей проблеме.
Я хочу, чтобы ToolStripMenuItems ToolStripDropDownMenu закрывались только тогда, когда пользовательская мышь покидает область, содержащую их (все ToolStripMenuItems)
В настоящее время у меня есть следующий код:
{ ToolStripDropDownMenu menu = new ToolStripDropDownMenu();
menu.AutoClose = true;
foreach (ToolStripMenuItem toolStripItem in this.collectionToolStripMenuItems)
{
menu.Items.Add(toolStripItem);
}
menu.Show(sender, e.ControlLocation);
}
Я определяю toolStripMenuItems в списке: collectionToolStripMenuItems с помощью кода:
ToolStripMenuItem ToolStripItem = new ToolStripMenuItem(item.Name);
ToolStripItem.Click += new EventHandler(this.ValueMenuItem_Click);
ToolStripItem.MouseLeave += new EventHandler(MouseLeave);
ToolStripItem.MouseEnter += new EventHandler(MouseEnter);
где
private void MouseLeave(object sender, EventArgs e)
{
ToolStripMenuItem item2 = (ToolStripMenuItem)sender;
ToolStripDropDownMenu menu = (ToolStripDropDownMenu)item2.Owner;
menu.Hide();
}
private void MouseEnter(object sender,EventArgs e)
{
ToolStripMenuItem item2 = (ToolStripMenuItem)sender;
ToolStripDropDownMenu menu = (ToolStripDropDownMenu)item2.Owner;
menu.Show();
}
private void ValueMenuItem_Click(object sender, EventArgs e)
{// Do something
ToolStripMenuItem item2 = (ToolStripMenuItem)sender;
ToolStripDropDownMenu menu = (ToolStripDropDownMenu)item2.Owner;
menu.Show();
return;
}
Это работает, однако, каждый раз, когда пользователь щелкает или покидает toolStripMenuItem, dropDown закрывается на очень короткое мгновение, поэтому кажется, что все это мигает.
Может кто-нибудь, пожалуйста, порекомендуйте лучший подход? Большое спасибо!
0 ответов
Я столкнулся с аналогичной проблемой. Позвольте мне поделиться всем решением. Пусть toolStripMenuItem будет нашим объектом ToolStripMenuItem.
Сделайте это ВНЕ Form1.Designer.cs:
- Установите для AutoClose значение false
toolStripMenuItem.DropDown.AutoClose = false;
- Добавьте новый обработчик событий, который закроет раскрывающийся список, когда мышь покинет раскрывающееся меню.
toolStripMenuIntem.DropDown.MouseLeave += System.EventHandler(this.DropDown_MouseLeave)
Конечно, вам нужно создать этот обработчик событий:
private void DropDown_MouseLeave(object sender, EventArgs e)
{
// Close DropDown when mouse leave drop down control:
toolStripMenuItem.DropDown.Close();
}
Приведенное выше решение является частичным. Вам также может потребоваться закрыть раскрывающийся список, когда мышь покидает сам элемент управления toolStripMenuItem. Для этого я проверял, находится ли мышь внутри раскрывающегося списка, когда она покидает элемент управления toolStripMenuItem. Если мышь находится за пределами toolStripMenuItem и за пределами раскрывающегося списка, я закрываю раскрывающееся меню.
private void ToolStripMenuItem_MouseLeave(object sender, EventArgs e)
{
Point cursor = toolStripMenuItem.DropDown.PointToClient(Control.MousePosition);
bool cursorInDropDown = toolStripMenuItem.DropDown.ClientRectangle.Contains(cursor);
if (!cursorInDropDown)
{
// Cursor is NOT in drop down. Close Drop down!
toolStripMenuItem.DropDown.Close();
}
}
Не забудьте связать событие MouseLeave объекта toolStripMenuItem с ToolStripMenuItem_MouseLeave
.
Надеюсь, это поможет!