我正在制作wp 7.x / 8的应用程序。
有一个像 -
这样的功能public void draw()
{
.............
ImageBrush imgbrush = new ImageBrush();
imgbrush.ImageSource = new BitmapImage(...);
rect.Fill = imgbrush; //rect is of type Rectangle that has been created
//and added to the canvas
........
}
和另一个功能
private void clicked(object sender, RoutedEventArgs e)
{
draw();
........
if (flag)
{
Thread.sleep(5000);
draw();
}
}
但是当单击该按钮时,两个绘制操作的结果同时出现在屏幕上。
如何使第二次draw()操作的结果在延迟一段时间后出现?
或者屏幕上是否有缓冲区,直到缓冲区未填满,屏幕才会刷新?
在这种情况下,如何显式刷新或刷新屏幕或强制使用Rectangle的.fill()方法在屏幕上进行更改?
在这方面的任何帮助都将受到高度赞赏。
答案 0 :(得分:1)
正如pantaloons所说,由于你所有的动作都在同一个线程(第一次抽奖,睡眠和第二次抽奖),因此UI本身永远不会有机会更新。但是,有一个稍微好一点的实现(尽管它遵循与上述建议相同的原理)。
通过使用计时器,您可以让它等待另一个线程,允许UI在第二次绘制之前从第一次绘制更新,如下所示:
private void clicked(object sender, RoutedEventArgs e)
{
draw();
........
if (flag)
{
var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(5) };
timer.Tick += (sender, args) => { timer.Stop(); draw(); };
timer.Start();
}
}
在此解决方案中,所有调用都由DispatcherTimer处理(它将自动回调到UI线程)。此外,如果需要连续两次调用draw,计时器将继续打勾直到停止,因此扩展包含计数将非常简单。
答案 1 :(得分:0)
问题是你是通过休眠来阻止UI线程的,所以在该函数返回之前,永远不会抽取绘制消息,其中更改同步发生。一个hacky解决方案将类似于以下内容,但实际上您应该更改您的应用程序设计以使用async / await模式。
private void clicked(object sender, RoutedEventArgs e)
{
draw();
if (flag)
{
System.Threading.Tasks.Task.Run(() =>
{
System.Threading.Thread.Sleep(5000);
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
draw();
});
});
}
}