我有一个矩形,我想使其可见,然后我想等待500毫秒,然后我想再次使它不可见。如何使用BackgroundWorker来显示/隐藏WPF UI元素?
起初我试过这段代码:
MuzzleFlash.Visibility = Visibility.Visible;
Thread.Sleep(500);
this.UpdateLayout();
this.InvalidateVisual();
MuzzleFlash.Visibility = Visibility.Collapsed;
我想这两个中间线作为他们理应被迫窗户更新,但是这一切确实是半秒钟的停顿不改变任何形式的矩形。
所以我听说了BackgroundWorkers以及他们应该如何使用。经过一番简短的阅读后,我想出了这个。需要注意的是拍摄被预订在画布MouseDown事件,这在以前的工作:
private void Shoot(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
BackgroundWorker UIUpdater = new BackgroundWorker();
UIUpdater.WorkerSupportsCancellation = true;
UIUpdater.WorkerReportsProgress = false;
UIUpdater.DoWork += new DoWorkEventHandler(UI_DoWork);
UIUpdater.RunWorkerCompleted += new RunWorkerCompletedEventHandler(cancelUIUpdate);
}
private void UI_DoWork(object sender, DoWorkEventArgs e)
{
MuzzleFlash.Visibility = Visibility.Visible;
Thread.Sleep(500);
this.UpdateLayout();
this.InvalidateVisual();
MuzzleFlash.Visibility = Visibility.Collapsed;
}
private void cancelUIUpdate(object sender, RunWorkerCompletedEventArgs e)
{
BackgroundWorker bw = sender as BackgroundWorker;
bw.CancelAsync();
}
现在它甚至不停顿半秒,这表明,我认为工人没有做任何事情。我该如何解决这个问题,并使矩形出现/消失?
我会使用一个计时器。你并没有真的在做工作。 – Paparazzi
它不起作用,因为您正在执行工作线程中的所有操作。主UI线程说*“启动一个后台工作,然后结束”*,而bg工人说*“设置可见标志为真,等待一段时间,设置可见标志为假,然后结束回UI线程,以便UI可以更新”*。请注意,bg线程永远不会将通知发送回主UI线程以更新显示。如果你想这样做,我会建议寻找WPF的Dispatcher。请参阅[本答案](http://stackoverflow.com/a/15930792/302677)以获得一个简短摘要,其中使用了与您在此处执行的操作类似的示例。 – Rachel
一个简单的“解决方案”就是将你的'MuzzleFlash.Visibility = Visibility.Visible'行移动到你的主UI线程以在'Shoot(...)'方法内执行。然后代码表示*“设置可见标志为真,启动bg工作,然后结束并更新显示”*,而bg工人说*“等待一段时间,设置可见标志为假,然后结束回UI线程,以便它可以更新”* 。此外,您可能希望在RunWorkerCompleted中放置*“set visible flag false”*位,因为WPF通常不会更新它们未创建的线程上的对象,因此您可能会遇到尝试从bg更新的异常工人。 – Rachel