Как получить модальные диалоги из контекстного меню NotifyIcon? - PullRequest
1 голос
/ 19 апреля 2009

У меня есть иконка в трее с прикрепленным контекстным меню. У меня проблема в том, что вызов ShowDialog () из контекстного меню Обработчик нажатий не приводит к модальному диалогу.

Это легко воспроизвести с помощью проекта C # по умолчанию. Просто добавьте следующий код в файл Form1.cs:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    ToolStripMenuItem contextMenuShowMsg = new System.Windows.Forms.ToolStripMenuItem();
    contextMenuShowMsg.Name = "contextMenuShowMsg";
    contextMenuShowMsg.Text = "Show MessageBox...";
    contextMenuShowMsg.Click += new System.EventHandler(this.contextMenuShowMsg_Click);

    ContextMenuStrip contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
    contextMenuStrip.Items.Add(contextMenuShowMsg);

    NotifyIcon notifyIcon = new NotifyIcon();
    notifyIcon.Text = "DlgTest";
    notifyIcon.Icon = SystemIcons.Application;
    notifyIcon.Visible = true;
    notifyIcon.ContextMenuStrip = contextMenuStrip;
}

private void contextMenuShowMsg_Click(object sender, EventArgs e)
{
    MessageBox.Show(this, "Test MessageBox");
}

Если вы создадите и запустите это, вы сможете получить два окна сообщений на экране, просто дважды выбрав пункт контекстного меню. Разве это не должно быть модальным? Замена этого на вызов ShowDialog () для другой формы приводит к тому же немодальному поведению.

Мое предположение заключается в том, что NotifyIcon специально не привязан к форме, как это было бы в типичном приложении Windows. Но я не вижу никакого способа сделать это.

Есть идеи? Заранее спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 19 апреля 2009

Вам нужно будет отслеживать активацию меню в системном трее и отключать его при открытом диалоге.

0 голосов
/ 19 апреля 2009

Я бы предложил сделать две вещи, прежде чем пытаться отобразить окно модального сообщения:

  1. Сделать окно владельца вашего значка видимым.
  2. Дайте ему фокус.

Как только вы это сделаете, this в MessageBox.Show станет легальным «модальным родителем».

Черт, даже имеет больше смысла, что окно сообщения будет отображаться поверх любой программы, сгенерировавшей его, верно? Таким образом, у пользователя есть некоторый контекст для того, что представляет собой окно сообщения!

...