Остановка ContextMenu от гашения при добавлении элемента, когда он виден - PullRequest
1 голос
/ 07 ноября 2011

Кажется, что если вы добавите запись в ContextMenu, пока она открыта, она превратится в пустой, крошечный квадрат.

Как это:

Для воспроизведения просто создайте новое приложение WinForms и замените класс Form1 следующим:

public partial class Form1 : Form
{
    ContextMenu _menu = new ContextMenu();

    public Form1()
    {
        InitializeComponent();

        ContextMenu = _menu;

        _menu.MenuItems.Add(new MenuItem() { Text = "Test" });

        Timer a = new Timer() { Interval = 3000 };
        a.Tick += (sender, e) =>
        {
            _menu.MenuItems.Add(new MenuItem() { Text = "Woah!" });
        };
        a.Start();
    }
}

Затем просто запустите, щелкните правой кнопкой мыши и подождите.

Можно ли обойти это, не прибегая к использованию чего-то вроде ContextMenuStrip?

1 Ответ

2 голосов
/ 07 ноября 2011

Используйте метод Show сразу после добавления, чтобы обойти проблему:

Timer a = new Timer() { Interval = 3000 };
a.Tick += (sender, e) =>
{
    _menu.MenuItems.Add(new MenuItem() { Text = "Woah!" });
    _menu.Show(this, Point.Empty);
};

Может также потребоваться отслеживать состояние всплывающего окна, чтобы избежать неожиданного отображения.Вот полный источник для достижения этой цели:

public partial class Form1 : Form
{
    ContextMenu _menu = new ContextMenu();

    public Form1()
    {
        InitializeComponent();

        ContextMenu = _menu;

        _menu.Popup += new EventHandler(_menu_Popup);
        _menu.Collapse += new EventHandler(_menu_Collapse);

        _menu.MenuItems.Add(new MenuItem() { Text = "Test" });

        Timer a = new Timer() { Interval = 3000 };
        a.Tick += (sender, e) =>
        {
            _menu.MenuItems.Add(new MenuItem() { Text = "Woah!" });
            if (_menuPoppedUp)
                _menu.Show(this, Point.Empty);
        };
        a.Start();
    }

    bool _menuPoppedUp;

    void _menu_Collapse(object sender, EventArgs e)
    {
        _menuPoppedUp = false;
    }

    void _menu_Popup(object sender, EventArgs e)
    {
        _menuPoppedUp = true;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...