[英]C# WPF Window not Updating in foreach loop
在我的項目中,我需要加載“項目”。 我在foreach循環中加載所有這些“項目”。 在這個foreach循環中,我想顯示一個帶有進度條的狀態窗口,每當新項目加載時它就會更新。
我現在的問題是,帶有progrssbar的狀態窗口不會更新。 它似乎只是像我項目中的所有其他窗口一樣“凍結”(我也讓程序將它正在做的事情打印到控制台中)。
這是代碼:
Status StatusWd = new Status();
StatusWd.pb_Status.Maximum = animes.Length;
StatusWd.SetStatusText("Animes in AnimeBibliothek laden...");
StatusWd.Show();
bool white = false;
bool black = true;
foreach (string anime in animes)
{
if (white)
{
//Not working..
AB_Output.WriteLine(GetTime() + "Weißes User Control laden...");
AddWhiteUcpToStk(anime);
white = false;
black = true;
}
else if (black)
{
AB_Output.WriteLine(GetTime() + "Schwarzes User Control laden...(" + anime + ")");
AddBlackUCPToStk(anime);
//white = true;
//black = false;
}
StatusWd.pb_Status.Value = Array.IndexOf(animes, anime);
}
StatusWd.Close();
這不僅僅是不會更新的進度條。 此外,窗口中的標簽會在值更改時更新,不會更改。 我對它進行了調整,並且進度條的值發生了變化,標簽內容也發生了變化......
如果你能解釋我的解決方案會很好。
LG Sinmson
阻止UI線程會這樣做....
無論何時運行長操作,都需要確保它在某個其他線程上,否則您將被視為“無響應”。
所以,首先要將你的加載移動到另一個線程上。 Thread
, BackgroundWorker
和Task
都是合理的方法。 然后,您需要將任何UI更改封送回 UI線程。
如果您使用了async
(和Tasks
),那么框架會為您執行此操作。 同樣,如果使用正確的MVVM模式, PropertyChanged
事件將自動封送到正確的線程上。
如果你不能以“正確”的方式做到這一點,那么使用Dispatcher.BeginInvoke
自己編組這些更改。
Dispatcher.BeginInvoke(new Action(() =>
{
//UI code ONLY
}), DispatcherPriority.Normal);
但這只是作為創可貼。 轉向基於異步或MVVM的代碼(甚至更好!)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.