我有一个充满图像文件的文件夹,其名称我已加载到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();
}
它不显示任何内容。
我是否需要在睡眠之间调用或运行以使某些线程唤醒并显示图像?我做错了什么?
答案 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秒后,您可以将下一个故事板出列并加载图像,当它完成时,它会使下一个出列并开始,依此类推。