Событие щелчка отложено в ContextMenu, прикрепленном к NotifyIcon - PullRequest
0 голосов
/ 20 декабря 2011

Я работаю над плагином (использующим System.ComponentModel.Composition), чтобы приложение размещало значок в области уведомлений пользовательского интерфейса Windows.

trayMenu.MenuItems.Clear();

// Create context menu items
foreach( IJob job in jobs ) {
  MenuItem menuItem = new MenuItem( job.Name ) {Tag = job};
  menuItem.Click += MenuItemClick;
  trayMenu.MenuItems.Add( menuItem );
}

private void MenuItemClick( object sender, EventArgs e ) {
  // ...
}

Теперь, когда я нажимаю на элемент в контекстном меню этого значка, обработчик Click не вызывается.
Интересно, что, когда я снова щелкаю правой кнопкой мыши по значку (после щелчка по элементу меню), вызывается обработчик Click для ранее нажатой MenuItem. Щелчок левой кнопкой мыши или наведение мыши на значок не запускает этот шаг.

Что происходит?

Обновление : У меня сильное чувство, что моя проблема связана с этим вопросом . Но я все еще пытаюсь выяснить, как я могу применить это к моему плагину / приложению.

1 Ответ

0 голосов
/ 20 декабря 2011

Насколько я понимаю, проблема в том, что никакие оконные сообщения не обрабатываются для NotifyIcon (или, по крайней мере, не столько сообщений, сколько мне понравилось / нужно).

Я решил проблему, унаследовав от Formи запуск еще одного сообщения для моего плагина.

using System;
using ...

namespace JobTracker.Tray {
  [Export( typeof( IJobTrackerPlugin ) )]
  public class TrayPlugin : Form, IJobTrackerPlugin {

    #region Plugin Interface
    [Import( typeof( IJobTracker ) )]
#pragma warning disable 649
      private IJobTracker _host;
#pragma warning restore 649
    private IJobTracker Host {
      get { return _host; }
    }

    public void Initialize() {
      trayMenu = new ContextMenu();
      trayMenu.MenuItems.Add( "Exit", OnExit );

      trayIcon = new NotifyIcon();
      trayIcon.Icon = new Icon( SystemIcons.Application, 32, 32 );

      trayIcon.ContextMenu = trayMenu;

      // Show the proxy form to pump messages
      Load += TrayPluginLoad;
      Thread t = new Thread(
        () => {
          ShowInTaskbar    = false;
          FormBorderStyle  = FormBorderStyle.None;
          trayIcon.Visible = true;
          ShowDialog();
        } );
      t.Start();
    }

    private void TrayPluginLoad( object sender, EventArgs e ) {
      // Hide the form
      Size = new Size( 0, 0 );
    }
    #endregion

    private NotifyIcon trayIcon;    
    private ContextMenu trayMenu;

    private void OnExit( object sender, EventArgs e ) {
      Application.Exit();
    }

    #region Implementation of IDisposable

    // ...

    private void DisposeObject( bool disposing ) {
      if( _disposed ) {
        return;
      }
      if( disposing ) {
        // Dispose managed resources.
        if( InvokeRequired ) {
          EndInvoke( BeginInvoke( new MethodInvoker( Close ) ) );
        } else {
          Close();
        }
        trayIcon.Dispose();
        trayMenu.Dispose();
      }
      // Dispose unmanaged resources.
      _disposed = true;
    }
    #endregion
  }
}

Кажется, отлично работает.

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