Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF/C中随机显示图像#_C#_Wpf - Fatal编程技术网

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

C# 在WPF/C中随机显示图像#,c#,wpf,C#,Wpf,我有一个文件夹,里面装满了图像文件,我把它们的名字加载到了一个字符串数组中。我有一个按钮来显示它们。这项工作:(XAML片段): 当我点击下一步按钮时,它会显示一个新的图像。如果我再次单击它,它会显示另一个图像。但我真正想要的是显示一系列随机图像,每个图像之间有10秒的等待时间。但如果我将下一个按钮处理程序更改为: private void buttonNext_Click(object sender, RoutedEventArgs e) { DisplayNextRandomImag

我有一个文件夹,里面装满了图像文件,我把它们的名字加载到了一个字符串数组中。我有一个按钮来显示它们。这项工作:(XAML片段):

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

private void buttonNext_Click(object sender, RoutedEventArgs e)
{
    DisplayNextRandomImage();
    System.Threading.Thread.Sleep(10000);
    DisplayNextRandomImage();
    System.Threading.Thread.Sleep(10000);
    DisplayNextRandomImage();
}
它没有显示任何内容


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

排一个
队列。并添加所有图像列表,加载第一个图像,然后在10秒后,您可以将下一个故事板出列并加载图像,完成后,将下一个故事板出列并开始加载,依此类推。

制作一个
队列。然后添加所有图像列表,加载第一个图像,然后在10秒后,您可以将下一个故事板排出来并加载图像,当完成后,将下一个图像排出来并开始加载,依此类推。

传统的做法是使用,回调发生在主线程上,因此您在操作GUI元素时不会遇到任何问题

最近的一个选项是使用,在这种情况下,只需将单击处理程序更改为:

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

这两种方法都不能处理用户单击按钮两次的情况,但这应该足以让您开始操作。

传统的方法是使用回调,回调发生在主线程上,这样您就不会在操作GUI元素时遇到任何问题

        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();
        }
最近的一个选项是使用,在这种情况下,只需将单击处理程序更改为:

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);
您也可以使用以下简写符号:

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

使用故事板动画如果你有
线程。睡眠(…)
在你的代码中,你可能做错了什么。在这种情况下,您正在休眠UI线程,因此难怪它不会更新!您还应该避免调用
Random Random=new Random()。最好在应用程序中使用单个随机对象,以避免重复值。如果有
线程,请使用情节提要动画。睡眠(…)
在代码中,您可能做错了什么。在这种情况下,您正在休眠UI线程,因此难怪它不会更新!您还应该避免调用
Random Random=new Random()。最好在应用程序中使用单个随机对象,以避免重复值。