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

我已经尝试了很多版本(包括使用计时器和切换代码)不知道出了什么问题

numericUpDown1 是幻灯片的时长,一直用整数测试,还是不行

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 回答