2013-07-31 1 views
0

사용자가 전환 할 수있는 항목 메뉴가 있습니다. 사용자가 원하는 모든 항목을 확인할 수 있도록 메뉴가 열려 있어야합니다. autoclose = false로 설정하면 효과가 좋습니다. 그러나, 나는 또한 지금 창을 닫을 수 없다. 나는 폼에 메뉴를 클릭 해 보았고, 탈출구를 치고, 메뉴 아이템을 치고, 메뉴에 대한 keycombo를 치고, 아무런 효과가 없었다.autoclose = false로 설정된 toolstripmenuitem을 닫으려면 어떻게합니까?

이상적으로는 사용자가 양식이나 기본적으로 아무 것도 누르지 않고 메뉴를 닫거나 이탈을 누르면됩니다. 나는 그것을 어떻게 성취 할 것인가? 나는 폼에서 gotfocus 이벤트를 만들고 아이템을 시도했다. 거기에는 HidDropDown하지만 주사위는 없다.

감사합니다.

+0

'ToolStripDropDown'에 대해 이야기하고 있다면'Close()'메소드가 있습니다. –

답변

1

양식의 클릭 이벤트를 생성 한 다음 자체 클릭 이벤트가없는 모든 컨트롤에 대해 클릭 이벤트를 양식의 클릭 이벤트로 설정하십시오. 다른 컨트롤에 대한 기존의 클릭 이벤트에 toolStripDropDownButton.HideDropDown();

복사 코드 : 이벤트에서

는 메뉴를 숨길 수있는 코드를 포함한다.

양식의 아무 곳이나 클릭하면 월 캘린더가 숨겨진 처리 방법입니다.

옵션으로 escape 키를 포함하려면 KeyDown 이벤트와 동일한 작업을 수행하여 코드를 실행하기 전에 이스케이프 키인지 확인하십시오.

+0

고마워요, 그 속임수를했습니다. 나는 tabPage와 tabControl에 폼을 더한 폼에 더하여, 충분히 커버해야한다고 생각했다. 이상하게도 나는 toolstripmenuitem 만 할 수 없었다. HideDropDown(); 그것은 작동하지 않았다. 나는 toolstripmenuitem.AutoClose = true를해야만했다. toolstripmenuitem.HideDropDown(); toolstripmenuitem.AutoClose = false; 그래도 고마워. –

0

나는 비슷한 문제가있어서 여기 내 해결책이있다. 일반적인 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 

    [...] 
} 

이 솔루션은 사용자를 위해 여분의 클릭을 저장합니다.이 솔루션은 마우스를 모든 항목 밖으로 이동하면 메뉴를 닫습니다.

관련 문제