[英]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.