2017-08-15 1 views
-1

WPFアプリケーションでウィンドウが表示され、ユーザーがボタンをクリックするとタスクが実行され、コンテキストメニューの通知領域のトレイアイテムに最小化されますユーザーが操作を取り消すことができるようにします。アプリケーションがバックグラウンドワーカーを実行しているときにNotifyIconが表示されない

BackgroundWorkerを使用する前にコンテキストメニューが機能しましたが、キャンセルはできませんでした。バックグラウンドワーカーを実装して以来、.runworkerasync()メソッドが実行されるとコンテキストメニューは表示されません。

マイアイコン通知:ユーザーがボタンをクリックすると、その後

private void setup_NotifyIcon() 
{ 
    myNotifyIcon = new NotifyIcon(); 
    setTrayIcon(); 

    myNotifyIcon.MouseDown += new MouseEventHandler(myNotifyIcon_MouseDown); 

    var menuItemCancel = new MenuItem("Cancel Parsing"); 
    var contextMenu = new ContextMenu(); 
    menuItemCancel.Click += new System.EventHandler(this.menuItemCancel_Click); 

    contextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { menuItemCancel }); 
    myNotifyIcon.ContextMenu = contextMenu; 

} 

    private void menuItemCancel_Click(object Sender, EventArgs e) 
    { 
     //do something 
    } 

    void myNotifyIcon_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      //do something 
     } 
    } 

を::

worker.RunWorkerAsync(); 

獲得したのはなぜ私のアプリケーションを実行すると、私はこのようにそれを設定すると

public NotifyIcon myNotifyIcon; 

を't myNotifyIcon.MouseDown + =新しいMouseEventHandler(myNotifyIcon_MouseDown);コンテキストメニューを起動しますか?

+0

UIのスレッドコンテキストでコンテキストメニューを表示しないでください。ここを参照pls https://stackoverflow.com/questions/11625208/accessing-ui-main-thread-safely-in-wpf –

+0

スニペットはこの問題を診断するのにかなり役に立たない。あなたのUIを最小化しないでください。まだ応答はありますか?あなたは、窓を閉じてもいいですか?そうでなければ、MouseDownイベントに応答しません。 –

答えて

1

解決策は、コメントのセバスチャンによって提案されたスレッドの問題であることが判明しました。

キーは、Application.Run()を使用して別のスレッドでアイコンを開始し、そのコード内でアイコンを表示することでした。

この操作が完了したら、アイコンを右クリックするとキャンセル機能が処理されます。

private void setup_NotifyIcon() 
    { 
     Thread notifyThread = new Thread(
     delegate() 
     { 
      myNotifyIcon = new NotifyIcon(); 
      setTrayIcon(); 

      myNotifyIcon.MouseDown += new MouseEventHandler(myNotifyIcon_MouseDown); 

      mnuCancel = new MenuItem("Cancel Parsing"); 
      menu = new ContextMenu(); 
      mnuCancel.Click += new System.EventHandler(menuItemCancel_Click); 

      menu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { mnuCancel }); 
      myNotifyIcon.ContextMenu = menu; 

      myNotifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; //Shows the info icon so the user doesn't thing there is an error. 
      myNotifyIcon.BalloonTipText = "The P6 Parser will minimize to the system tray while working."; 
      myNotifyIcon.BalloonTipTitle = "Processing..."; 

      myNotifyIcon.Visible = true; 
      myNotifyIcon.ShowBalloonTip(500); 

      myNotifyIcon.Visible = true; 
      System.Windows.Forms.Application.Run(); 
     }); 
     notifyThread.Start(); 

    } 
関連する問題