我正在为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();
}
}
但是,单击该按钮时,双方平局操作的结果同时出现在屏幕上。
如何使第二轮抽签()操作的结果一些延迟后出现?
或者是有什么样缓冲屏幕,直到缓冲区没有填充屏幕不会刷新?
在这种情况下,如何刷新或明确地刷新屏幕或强制矩形的.fill伪()方法,使屏幕上的变化?
在这方面的任何帮助将高度赞赏。
至于裤子说,因为你的所有行动都是在同一个线程(第一次抽签,睡眠,第二个平局)上,用户界面本身从来没有得到一个机会来更新。 然而,有一个稍微好一点的实现(虽然它遵循相同的本金上述建议)。
通过使用定时器,可以让踢它等待另一个线程,允许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线程)来处理。 另外,如果平局需要调用比连续两次以上,定时器将继续滴答,直到停止,所以这将是非常简单的扩展到包括计数。
问题是,你是睡阻塞UI线程,所以平局的消息从来没有抽,直到该函数返回,这里的变化同步发生。 哈克的解决办法是像下面这样,虽然你真的应该改变你的应用程序设计使用异步/等待模式。
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();
});
});
}
}