2009-08-27 121 views
1

我的Windows窗體應用程序(C#)有一個奇怪的問題。我在我的項目中有一個帶有NotifyIcon的表單(Form1)和另一個表單(Form2)。 Form1有一些代碼基本上做了一些XML解析,並在Form2上添加了一堆LinkLabel。這一切工作正常。Windows窗體:關閉,但不關閉

在NotifyIcon上,我有一個帶有EventHandler的ContextMenu MenuItem(稱爲「Refresh」),基本上可以通過XML解析命令運行。我還在NotifyIcon上有一個MouseDoubleClick命令,當系統托盤圖標被雙擊時,它打開Form2(使用ShowDialog())顯示LinkLabels的鏈接。這也很好。

我有Form2上的一個按鈕控件(稱爲 「關閉」),正在使用此事件處理代碼:

private void btnClose_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

關閉窗體2。這也很好。

但是,根據Form1的NotifyIcon上的「Refresh」ContextMenu MenuItem命中的次數,這是在Form2關閉之前必須按下Form2上的「關閉」按鈕控件的次數。例如,如果用戶三次在Form1上點擊「Refresh」MenuItem,他們將不得不在Form2上點擊「關閉」按鈕控件三次。這幾乎就像Form2明顯關閉,但代碼似乎沒有認識到它已關閉。

我是新來的Windows窗體的發展,所以也許這是我不知道的生命週期的事情。任何幫助,將不勝感激。

編輯。我會嘗試發佈相應的代碼:

//NotifyIcon Form (Form1) 
//ico is the ID of the NotifyIcon 
public partial class TrayIcon : Form 
{ 
    Message msg = new Message(); //Form2 
    ContextMenu contextMenu = new ContextMenu(); 

    public TrayIcon() 
    { 
     InitializeComponent(); 
    } 

    private void TrayIcon_Load(object sender, EventArgs e) 
    { 
     contextMenu.MenuItems.Clear(); 
     contextMenu.MenuItems.Add(0, new MenuItem("Refresh", new System.EventHandler(ico_Refresh))); 

     ico.DoubleClick += new MouseEventHandler(ico_ShowMsg); 

     DoXmlParsing(); 
    } 

    private void ico_Refresh(object Sender, EventArgs e) 
    { 
     TrayIcon_Load(null, null); 
    } 

    private void ico_ShowMsg(object Sender, MouseEventHandler e) 
    { 
     if (msg.Visible == false) 
      msg.ShowDialog(); 
    } 
} 

在窗體2(消息),我有這個點擊處理代碼按鈕:

private void btnClose_Click(object sender, EventArgs e) 
{ 
    this.Close(); 

    //I have also tried: 
    if (this.Visible) 
     this.Hide(); 
} 
+0

您可以發佈Refresh MenuItem的代碼和用於打開Form2的代碼嗎? – 2009-08-27 21:39:23

+0

Is Fo RM2是一種無模式的形式?你有沒有在btnClose_Click中放置一個斷點來確保它每次都被調用? – 2009-08-27 21:39:48

回答

9

我覺得這條線是這個問題:

ico.DoubleClick += new MouseEventHandler(ico_ShowMsg); 

您不斷添加更多的事件處理程序的雙擊,但從來沒有刪除它們(因爲TrayIcon_Load被稱爲ico_Refresh

在您關閉對話框中,.ShowDialog()被再次調用,但多次添加了此事件處理程序。

+0

羞恥這沒有upvoted更多。當我回去重讀這個問題時(在代碼編輯之後),我沒有發現這個問題。好決定! – 2009-08-28 13:31:38

2

你的說明,看來你刷新菜單項啓動一個表單2的新實例與以前的表單相比。

你能在Refresh menuitem後面顯示代碼嗎?

+0

看到上面貼的代碼 – 2009-08-27 23:22:20

2

我認爲你正在創建窗體2的每一次新的實例,所以你必須關閉每一個...

你能發佈的NotifyIcon MouseDoubleClick事件處理程序的代碼?


UPDATE:好的,我明白了,那是因爲你每次點擊菜單項時,它增加了一個新的處理程序的事件(菜單項和NotifyIcon的):沒有什麼可以防止重複處理,因此處理程序多次呼籲。由於表單是以模態方式顯示的,因此它會關閉,然後重新打開,然後關閉...

您只需註冊一次處理程序(例如在構造函數中)。此外,您可以只調用DoXmlParsing在ico_Refresh

+0

看到上面貼的代碼 – 2009-08-27 23:23:06

2

我不是100%肯定從你的問題,因爲沒有代碼,但它就像你正在使用的東西的聲音,我喜歡當窗體2推出以下:

Form2 f = new Form2(); 
f.Show(); 

如果是這種情況,並且表單總是顯示在完全相同的位置,則不是您必須多次關閉「it」,而是其中有許多實際存在且可見的表單。嘗試移動表格並查看它下面是否有任何內容。 :)

我建議改爲有一個Form2類的實例保留在內存中,直到您的應用程序退出時纔會關閉。根據需要顯示和隱藏它。

+0

我想到了,但是當我抓住標題欄並移動它時,只有一種形式。 – 2009-08-27 23:21:31