2011-10-17 83 views
4

我正在使用NotifyIcon類在任務欄中顯示一個圖標。該圖標執行2個功能 - 當用戶單擊左鍵時它應該顯示一個窗口,當用戶單擊右鍵時它應該顯示上下文菜單。除了用戶在上下文菜單中單擊某個選項後顯示的窗口外,此功能仍可正常工作。這裏是我的代碼:NotifyIcon ContextMenu和太多點擊事件

contextMenuItems = new List<MenuItem>(); 
contextMenuItems.Add(new MenuItem("Function A", new EventHandler(a_Clicked))); 
contextMenuItems.Add(new MenuItem("-")); 
contextMenuItems.Add(new MenuItem("Function B", new EventHandler(b_Clicked))); 
trayIcon = new System.Windows.Forms.NotifyIcon(); 
trayIcon.MouseClick += new MouseEventHandler(trayIcon_IconClicked); 
trayIcon.Icon = new Icon(GetType(), "Icon.ico"); 
trayIcon.ContextMenu = contextMenu; 
trayIcon.Visible = true; 

的問題是,當用戶選擇「功能A」或「功能B」我trayIcon_IconClicked事件。爲什麼會這樣呢?

感謝, Ĵ

回答

3

通過分配上下文菜單NotifyIcon的控制,它會自動捕獲右鍵單擊,並打開指定的上下文菜單中出現。如果您想在實際顯示上下文菜單之前執行某些邏輯,請將委派分配給contextMenu.Popup事件。

... 
contextMenu.Popup += new EventHandler(contextMenu_Popup); 
... 

private void trayIcon_IconClicked(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     //Do something here. 
    } 
    /* Only do this if you're not setting the trayIcon.ContextMenu property, 
    otherwise use the contextMenu.Popup event. 
    else if(e.Button == MouseButtons.Right) 
    { 
     //Show uses assigned controls Client location to set position, 
     //so must go from screen to client coords. 
     contextMenu.Show(this, this.PointToClient(Cursor.Position)); 
    } 
    */ 
} 

private void contextMenu_Popup(object sender, EventArgs e) 
{ 
    //Do something before showing the context menu. 
} 

我,爲什麼窗口彈出的猜測是,你正在開放是中使用NotifyIcon作爲目標的控制,所以當你點擊它,它的運行您指定的單擊處理上下文菜單到NotifyIcon。

編輯:另一個需要考慮的選擇是使用ContextMenuStrip代替。 NotifyIcon也有一個ContextMenuStrip屬性,它似乎有更多的功能與它相關(注意我可以做更多,可編程方式)。如果出於某種原因無法正常工作,可能會想要這樣做。

+0

謝謝,有沒有辦法sto使用NotifyIcon作爲目標控件?或者甚至可以手動彈出菜單?我已經嘗試了ContextMenu.Show(),但它需要一個控件作爲參數,而且似乎不會觸發Popup事件。 – JWood

+1

您是否正在處理trayIcon_IconClicked事件的點擊處理程序中的右鍵單擊?如果是這樣,不要。設置ContextMenu屬性會自動處理任何分配給上下文菜單的控件的右鍵單擊事件,因此您不需要再處理它。這就是爲什麼它在trayIcon_IconClicked事件中被省略,因爲你只是複製事件。嘗試一下,讓我知道。 – SPFiredrake

+0

我沒有手動處理點擊,我設置了ContextMenu屬性,但是當用戶從上下文菜單中選擇一個項目時,它給出了觸發trayIcon_IconClicked事件的行爲。上面的例子不起作用,因爲「this」是一個Application對象。我將嘗試使用ContextMenuStrip,並查看是否會給出更好的結果。 – JWood

0

我遇到了同樣的問題。 更改的NotifyIcon的文本菜單到的ContextMenuStrip不解決問題(其實當我改變了文本菜單的Click事件發生在的ContextMenuStrip表現,而不是當用戶在項目中的一個actualy點擊時。

我解決問題的辦法是改變我用來顯示左側點擊文本菜單,而不是使用我用鼠標鬆開的Click事件處理程序,並檢查其MouseButton點擊事件。

構建NotifyIcon的(notifyContext是System.Windows.Forms.ContextMenuStrip)

m_notifyIcon.MouseUp += new Forms.MouseEventHandler(m_notifyIcon_MouseUp); 
m_notifyIcon.ContextMenuStrip = notifyContext; 

Handling the left click event and show the main contextmenu: 

     void m_notifyIcon_MouseUp(object sender, Forms.MouseEventArgs e) 
     { 
      if (e.Button == Forms.MouseButtons.Left) 
      { 
       mainContext.IsOpen = ! mainContext.IsOpen; 
      } 
     }