Закрыть 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:

  1. Установите для AutoClose значение falsetoolStripMenuItem.DropDown.AutoClose = false;
  2. Добавьте новый обработчик событий, который закроет раскрывающийся список, когда мышь покинет раскрывающееся меню. 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.

Надеюсь, это поможет!

Другие вопросы по тегам