2012-05-17 23 views
3

我的問題很簡單。我有這種新形式,我只是這個代碼:StackOverflowException嘗試創建開始最小化的表單時

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     this.Resize += new EventHandler(Form1_Resize); 

     this.WindowState = FormWindowState.Minimized; 
    } 

    private void Form1_Resize(object sender, EventArgs e) 
    { 
     if (WindowState == FormWindowState.Minimized) 
     { 
      ShowInTaskbar = false; 
     } 
     else if (WindowState == FormWindowState.Normal) 
     { 
      ShowInTaskbar = true; 
     } 
    } 
} 

我要開始最小化這種形式,我想表明,只有當沒有最小化形式的任務欄圖標。但是當我運行這個時,我收到StackOverflowException。我認爲ShowInTaskbar = false正在調用resize方法。

+2

我認爲你是對的。 –

+1

如果ShowInTaskbar調用resize方法,那麼您可以在Form1_Resize方法中設置爲true的布爾標誌,如果其返回false。 – Waqar

+0

看到這個ShowInTaskBar在表單初始化/構建過程中的更新是許多問題的根源。看看也[這裏](http://stackoverflow.com/questions/2390945/how-to-change-this-showintaskbar-for-a-form-showdialog-while-keeping-it-op) – Steve

回答

3

將您的自動最小化放在「加載」事件中,而不是構造函數。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     this.Resize += new EventHandler(Form1_Resize); 
     this.Load += new EventHandler(Form1_Load); 

    } 

    void Form1_Load(object sender, EventArgs e) 
    { 
     WindowState = FormWindowState.Minimized; 
    } 

    private void Form1_Resize(object sender, EventArgs e) 
    { 
     if (WindowState == FormWindowState.Minimized) 
     { 
      ShowInTaskbar = false; 
     } 
     else if (WindowState == FormWindowState.Normal) 
     { 
      ShowInTaskbar = true; 
     } 
    } 
} 

我不完全知道爲什麼,這可以防止堆棧溢出,但只要我找到了,我會更新的答案。我已經在重現問題之後對其進行了測試,並且可以確認它是否有效!

+0

問題解決了,謝謝! – Thiago

0

你說得對。您可以通過在最小化表單後添加事件處理程序來修復此實例。

其他方法(這將阻止此問題在任何時候發生)是事件處理程序在啓動時從事件中移除它自己,並在退出之前將其自身恢復(因此它不會被調用當它自己調整大小時),或者使用一個布爾成員變量,該變量在事件處理程序執行時設置爲true,以便它知道忽略它觸發自身的任何事件。

相關問題