나는 비슷한 문제가있어서 여기 내 해결책이있다. 일반적인 MouseEnter 및 MouseLeave 이벤트 처리기를 만들고 마우스를 놓은 후에 메뉴를 지연시키기 위해 타이머를 사용했습니다.
다음은 3 개의 항목과 1 개의 구분 기호로 된 메뉴의 샘플 코드입니다. 샘플 2 항목 AutoClose 함께 작동하고 하나 (_modeChangingItem) 메뉴를 닫지 않습니다. 필요에 따라 쉽게 사용자 정의 할 수 있습니다. 자동 닫기 항목을 만들지 마십시오.
private Timer _menuTimer = new Timer();
private void MainFrm_Load (object sender, EventArgs e)
{
_menuTimer.Interval = 200;
_menuTimer.Tick += _menuTimer_Tick;
_rootMenuItem.MouseEnter += commonMenu_MouseEnter;
_rootMenuItem.MouseLeave += commonMenu_MouseLeave;
_menuItem1.MouseEnter += commonMenu_MouseEnter;
_menuItem1.MouseLeave += commonMenu_MouseLeave;
_menuItem2.MouseEnter += commonMenu_MouseEnter;
_menuItem2.MouseLeave += commonMenu_MouseLeave;
_separator.MouseEnter += commonMenu_MouseEnter;
_separator.MouseLeave += commonMenu_MouseLeave;
_modeChangingItem.MouseEnter += commonMenu_MouseEnter;
_modeChangingItem.MouseLeave += commonMenu_MouseLeave;
}
private void commonMenu_MouseLeave(object sender, EventArgs e)
{
_menuTimer.Stop();
// Comment this line out if you want none of the items to AutoClose
_rootMenuItem.DropDown.AutoClose = true;
ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
if (menuItem != null) menuItem.Tag = null;
ToolStripSeparator separator = sender as ToolStripSeparator;
if (separator != null) separator.Tag = null;
_menuTimer.Start();
}
private void commonMenu_MouseEnter(object sender, EventArgs e)
{
ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
if (menuItem != null) menuItem.Tag = new object();
ToolStripSeparator separator = sender as ToolStripSeparator;
if (separator != null) separator.Tag = new object();
}
private void _menuTimer_Tick(object sender, EventArgs e)
{
if (_rootMenuItem.Tag == null && _menuItem1.Tag == null &&
_menuItem2.Tag == null &&
_separator.Tag == null &&
_modeChangingItem.Tag == null)
{
_rootMenuItem.DropDown.Close();
}
_menuTimer.Stop();
}
private void _modeChangingItem_Click(object sender, EventArgs e)
{
ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
if (menuItem == null) return;
// Move this line to Form_Load if you want none of the items AutoClose
_rootMenuItem.DropDown.AutoClose = false; // Now the menu stays opened
[...]
}
이 솔루션은 사용자를 위해 여분의 클릭을 저장합니다.이 솔루션은 마우스를 모든 항목 밖으로 이동하면 메뉴를 닫습니다.
'ToolStripDropDown'에 대해 이야기하고 있다면'Close()'메소드가 있습니다. –