0

私は現在、ImageListからの写真のスライドショーをListViewからの可変表示時間で表示するプログラムを作成しようとしています。これは、numericUpDownを介してアクセスされますが、ボタンをクリックして開始すると、スライドショーは終了し、最後のスライドが表示された後、すぐに消えます(最後に「pictureBox1.Visible = false」を省略した場合は、そのまま残ります)。

現在のコード:

private void buttonSlideshow_Click(object sender, EventArgs e)
{
    pictureBox1.Visible = true;

    for (int s = 0; s < listView1.Items.Count; s++)
    {
        listView1.Items[s].Selected = true;
        pictureBox1.Image = imageList1.Images[s];

        DateTime later = DateTime.Now.AddMilliseconds((double)numericUpDown1);
        while (DateTime.Now < later)
        {
        }

    }
        pictureBox1.Visible = false;
}

私はこれの多くのバージョンを試しました(タイマーの使用やコードの切り替えを含む)何がうまくいかないのか分かりません

nudeUpDown1はスライドの長さであり、テストに整数を使用していますが、まだ機能しません

4

1 に答える 1

0

これを行う:

while (DateTime.Now < later)

UI スレッドをブロックしています。ホイールを回転させている間は、画面を再描画できません。代わりに、コールバックのあるタイマーを使用してください。

コードを少し修正する必要があります。for ループを使用するのではなく、現在のスライドの変数を定義し、クリック ハンドラーで変数をゼロに初期化し、画像ボックスを表示して、最初の画像を読み込み、タイマーを開始します。

タイマー ハンドラーでは、現在のインデックスをインクリメントし、スライドのリストの長さに対してチェックし、表示するスライドがまだある場合は、次のスライドを読み込んでから、タイマーを再度開始します (または、タイマーを使用できます)。これは繰り返し発火しますが、最後の発火の処理が完了する前に再度発火しないように注意する必要があるかもしれません)。スライドが残っていない場合は、クリーンアップして画像ボックスを再び非表示にします.

最後に、タイマーが起動するスレッドに注意してください。win フォームでは、UI スレッドで起動する System.Windows.Forms.Timer を使用でき、問題はありません。WPF では、UI スレッドでも起動する DispatcherTimer を使用できます。他のタイマーは通常、独自のスレッドで実行され、UI を更新するはずのものをすべて UI スレッドにプッシュする処理を行う必要があります。

于 2012-04-30T13:41:47.703 に答える