繁体   English   中英

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

[英]Randomly displaying images in WPF/C#

我有一个充满图像文件的文件夹,其名称已经加载到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秒。 但是,如果我将“下一步”按钮处理程序更改为:

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

它不显示任何内容。

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

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

最近的一种选择是使用异步编程 ,在这种情况下,只需将点击处理程序更改为此即可:

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

两种方法都无法处理用户单击按钮两次的情况,但这足以使您入门。

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

创建一个Queue<Storyboard> 并添加所有图像列表,加载第一个图像,然后在10s之后,您可以使下一个情节提要板出队并加载图像,完成后它将退出下一个情节提要并开始,依此类推。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM