我有一個矩形,我想使其可見,然後我想等待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