Отобразить меню для ToolStripDropDownButton в виде контекстного меню - PullRequest
0 голосов
/ 13 февраля 2009

У меня есть панель инструментов, которая содержит ToolStripDropDownButton. В качестве альтернативного метода доступа я также хотел бы иметь возможность отображать раскрывающееся меню этой кнопки в виде контекстного меню, когда пользователь щелкает правой кнопкой мыши в области под панелью инструментов.

Я попробовал следующий код, но он не работал (он отображал выпадающий список кнопки в обычном месте, прямо под кнопкой):

Point contextMenuLocation = [get from WM_CONTEXTMENU]
myButton.DropDown.Show( contextMenuLocation );

Лучшая идея, которую я могу придумать, это скопировать элементы панели инструментов из раскрывающегося списка кнопки в ContextMenuStrip, но я не вижу простого способа сделать это (ToolStripItem не реализует метод ICloneable или метод Clone). Элементы полосы инструментов хранят ссылку на своего родителя, поэтому я не могу просто добавить существующие элементы в контекстное меню, так как это сломает кнопку.

У кого-нибудь есть хорошая идея, как этого добиться?

1 Ответ

2 голосов
/ 14 февраля 2009

Хороший способ заполнить два разных раскрывающихся списка одними и теми же элементами - это извлечь созданный элемент в функцию, которая создает необходимый раскрывающийся список непосредственно перед открытием любого экземпляра этого раскрывающегося списка. Это также позволяет включить отключение при изменении состояния приложения.

class A
{
    public A()
    {
        button = new ToolStripDropDownButton();
        button.DropDown = new ToolStripDropDown();

        ToolStripDropDown dropDown = new ToolStripDropDown();
        dropDown.Opening += DropDownOpening;
        menu.Items.DropDown = dropDown;

    }

    void DropDownOpening(object sender, EventArgs e)
    {
        ToolStripDropDown dropDown = sender as ToolStripDropDown;
        if(dropDown != null) 
        {
            dropDown.Items.Clear();
            BuildMenu(dropDown);
        }
        else
        {
            // throw if you like
        }
    }

    void BuildMenu(ToolStripDropDown dropDown)
    {
        // TODO : Add items to dropdown
        // TODO : Take decisions depending on current application state
    }

    ToolStripDropDownButton button;
    MenuStrip menu;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...