3

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

    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 方法。

4

2 回答 2

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;
        }
    }
}

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

于 2012-05-17T17:48:58.333 回答
0

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

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

于 2012-05-17T17:43:12.587 回答