5

とてもシンプルなロジックゲームを作ろうとしています。アイデアは、特定の数の色付きの正方形(ボタン)を持つマトリックスを表示してからそれらを非表示にすることであり、プレーヤーは色付きの正方形をクリックする必要があります。したがって、正方形/ボタンをペイントしてから元の色に戻るまでに2秒の遅延が必要です。すべてのコードはbutton_clickイベントに実装されます。

private void button10_Click(object sender, EventArgs e)
{

    int[,] tempMatrix = new int[3, 3];
    tempMatrix = MakeMatrix();
    tempMatrix = SetDifferentValues(tempMatrix);
    SetButtonColor(tempMatrix, 8);
    if (true)
    {
        Thread.Sleep(1000);
       // ReturnButtonsDefaultColor();
    }
    ReturnButtonsDefaultColor();
    Thread.Sleep(2000);

    tempMatrix = ResetTempMatrix(tempMatrix);
}

これはコード全体ですが、必要なのは呼び出しSetButtonColor()との間にいくらかの遅延を持たせることReturnButtonsDefaultColor()です。私のすべての実験はThread.Sleep()今まで成功していません。ある時点で遅延が発生しますが、色付きの四角/ボタンが表示されません。

4

4 に答える 4

7

Sleep呼び出しによってメッセージの処理が妨げられるため、ボタンの色が変わることはありません。

おそらくこれを処理する最も簡単な方法はタイマーを使用することです。2秒の遅延でタイマーを初期化し、デフォルトで無効になっていることを確認します。次に、ボタンクリックコードでタイマーが有効になります。このような:

private void button10_Click(object sender, EventArgs e)
{
    // do stuff here
    SetButtonColor(...);
    timer1.Enabled = true; // enables the timer. The Elapsed event will occur in 2 seconds
}

そして、タイマーのElapsedイベントハンドラー:

private void timer1_TIck(object sender, EventArgs e)
{
    timer1.Enabled = false;
    ResetButtonsDefaultColor();
}
于 2013-01-29T17:24:46.567 に答える
3

スレッドコンテキストを処理したりコードをフラグメント化したりする必要がないため、最も単純なソリューションであるTPLをいつでも使用できます。

private async void button10_Click(object sender, EventArgs e)
{

    int[,] tempMatrix = new int[3, 3];
    tempMatrix = MakeMatrix();
    tempMatrix = SetDifferentValues(tempMatrix);
    SetButtonColor(tempMatrix, 8);
    if (true)
    {
       await Task.Delay(2000);
       // ReturnButtonsDefaultColor();
    }
    ReturnButtonsDefaultColor();
       await Task.Delay(2000);

    tempMatrix = ResetTempMatrix(tempMatrix);
}
于 2013-01-29T17:28:06.977 に答える
2

タイマーを使用します。Thread.Sleep Start()タイマーの代わりに、tickイベントでReturnButtonsDefaultColor()を呼び出します。2番目のThread.Sleepの代わりに2番目のタイマーを使用するか、ある種の状態を保存して、tickイベントで使用することができます。

于 2013-01-29T17:22:52.433 に答える
0

タスクを使用できます。

        private void button10_Click(object sender, EventArgs e)
        {

            int[,] tempMatrix = new int[3, 3];
            tempMatrix = MakeMatrix();
            tempMatrix = SetDifferentValues(tempMatrix);
            SetButtonColor(tempMatrix, 8);

            Task.Factory.StartNew(
                () => 
                {
                    if (true)
                    {
                        Thread.Sleep(1000);
                        // ReturnButtonsDefaultColor();
                    }
                    ReturnButtonsDefaultColor(); //Need to dispatch that to the UI thread
                    Thread.Sleep(2000);

                    tempMatrix = ResetTempMatrix(tempMatrix); //Probably that as well
                });
        }

WPFでのディスパッチはWinformsとは異なり、グーグルで簡単に実行できるはずです;)

于 2013-01-29T17:29:19.620 に答える