簡體   English   中英

C#WPF窗口不在foreach循環中更新

[英]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線程會這樣做....

無論何時運行長操作,都需要確保它在某個其他線程上,否則您將被視為“無響應”。

所以,首先要將你的加載移動到另一個線程上。 ThreadBackgroundWorkerTask都是合理的方法。 然后,您需要將任何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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM