尝试创建开始最小化的表单时StackOverflowException

时间:2012-05-17 17:14:00

标签: c# winforms

我的问题很简单。我有这个新表格,我只是编码:

    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 个答案:

答案 0 :(得分: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;
        }
    }
}

我不完全确定为什么这会阻止堆栈溢出,但是一旦我发现,我就会更新答案。我在重现问题后对其进行了测试,并确认它有效!

答案 1 :(得分:0)

你是对的。您可以通过在最小化表单后添加事件处理程序来修复此实例。

其他方法(将在任何时候阻止此问题发生)是事件处理程序在事件启动时将其自身从事件中移除,并在它退出之前将其自身重新添加(因此在它退出时不会被调用它会自行调整大小),或者使用在事件处理程序执行时设置为true的bool成员变量,以便它知道忽略它触发的任何事件。