2013-07-31 3 views
0

У меня есть меню пунктов, которые пользователь может переключать. Я хотел, чтобы меню оставалось открытым, чтобы пользователь мог проверить все элементы, которые они хотят. Я устанавливаю autoclose = false, и теперь это отлично работает. Однако я также не могу закрыть окно lol. Я попытался щелкнуть по меню на форме, ударив побег, нажав на пункт меню, нажав кнопку keycombo для меню, ничего не работает.Как закрыть toolstripmenuitem, который установлен в autoclose = false?

В идеале, я хотел бы, чтобы пользователь мог просто щелкнуть по форме или в основном что угодно, кроме меню, чтобы закрыть его или нажать клавишу escape. Как я могу это сделать? Я попытался создать событие gotfocus в форме и сделать item.HideDropDown там, но не кубиками.

Спасибо!

+0

Если вы говорите о 'ToolStripDropDown', у него есть метод' Close() 'проверить это. –

ответ

1

Создайте событие клика для формы, а затем перейдите к нему и для каждого элемента управления, у которого нет собственного события кликов, установите событие click для него для формы.

В случае, включает в себя код, чтобы скрыть меню: 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) не закрывает меню. Вы можете легко настроить его для своих нужд, например. не делайте ни одного из элементов AutoClose.

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 

    [...] 
} 

Это решение экономит лишний клик для пользователя - таймер закрывает меню при перемещении мыши вне всех элементов.