在WPF / C#中随机显示图像

时间:2015-09-24 04:27:43

标签: c# wpf

我有一个充满图像文件的文件夹,其名称我已加载到String数组中。我有一个按钮来显示它们。这有效:(XAML片段):

<StackPanel >
    <Image Name="ImageViewer" Height="400" Width="400" />
</StackPanel> 

C#片段:

  void DisplayNextRandomImage()
    {
        Random random = new Random();
        int num = random.Next(_FileCount);  // pick a random file
        string selectedFileName = _sRoot + "\\" + _sFiles[num];
        BitmapImage bitmap = new BitmapImage();
        bitmap.BeginInit();
        bitmap.UriSource = new Uri(selectedFileName);
        bitmap.EndInit();
        ImageViewer.Source = bitmap; 
    }

    // "Next" button handler
    private void buttonNext_Click(object sender, RoutedEventArgs e)
    {
        DisplayNextRandomImage();
    }

当我点击“下一步”按钮时,它会显示一个新图像。如果我再次点击它会显示另一张图像。但我真正想要的是显示一系列随机图像,每个图像之间等待10秒钟。但是,如果我将Next按钮处理程序更改为:

private void buttonNext_Click(object sender, RoutedEventArgs e)
{
    DisplayNextRandomImage();
    System.Threading.Thread.Sleep(10000);
    DisplayNextRandomImage();
    System.Threading.Thread.Sleep(10000);
    DisplayNextRandomImage();
}

它不显示任何内容。

我是否需要在睡眠之间调用或运行以使某些线程唤醒并显示图像?我做错了什么?

3 个答案:

答案 0 :(得分:1)

传统的处理方式是使用DispatcherTimer,回调发生在主线程上,因此操作GUI元素时不会有任何问题。

更新的选项是使用asynchronous programming,在这种情况下,只需将点击处理程序更改为:

private async void buttonNext_Click(object sender, RoutedEventArgs e)
{
    while (true)
    {
        DisplayNextRandomImage();
        await Task.Delay(10000);
    }
}

两种方法都没有处理用户点击按钮两次的情况,但这应该足以让你开始。

答案 1 :(得分:1)

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            DisplayNextRandomImage();

            Dispatcher disp = ImageViewer.Dispatcher;
            DispatcherTimer t = new DispatcherTimer(TimeSpan.FromSeconds(10), DispatcherPriority.Normal, timer_Tick , disp);
            t.Start();
        }

        void timer_Tick(object sender, EventArgs e)
        {
            DisplayNextRandomImage();
        }

您也可以使用速记符号:

DispatcherTimer t = new DispatcherTimer(TimeSpan.FromSeconds(10), DispatcherPriority.Normal, (s1,e1)=>{DisplayNextRandomImage();} , disp);

答案 2 :(得分:-2)

制作Queue<Storyboard>。并添加所有图像列表,加载第一个图像,然后在10秒后,您可以将下一个故事板出列并加载图像,当它完成时,它会使下一个出列并开始,依此类推。