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

コンストラクターではなく、「Load」イベントに自動最小化を配置します。

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 に答える