我是Windows Forms的新手,所以我想知道问题的最佳方法是什么。
我希望ToolStripDropDownMenu的ToolStripMenuItems仅在用户的鼠标离开包含它们的区域时关闭(所有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 :(得分:0)
我正面临类似的问题。让我分享整个解决方案。让toolStripMenuItem成为我们的ToolStripMenuItem对象。
在Form1.Designer.cs之外执行此操作:
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();
}
}
请记住将toolStripMenuItem对象的事件MouseLeave链接到ToolStripMenuItem_MouseLeave
。
希望有帮助!