在我的项目中,我需要加载“项目”。 我在 foreach 循环中加载所有这些“项目”。 在这个 foreach 循环中,我想显示一个带有进度条的状态窗口,它会在每次加载新项目时更新。
我现在的问题是,带有进度条的状态窗口不会更新。 它似乎像我项目中的所有其他窗口一样只是“卡住”(我还让程序将它正在做的事情打印到控制台中)。
代码如下:
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 辛姆森
最佳答案
阻塞 UI 线程会做到这一点......
任何当你运行一个长时间的操作时,你需要确保它在其他线程上,否则你将被视为“无响应”。
因此,首先要做的是将您的加载移动到另一个线程上。 Thread
、BackgroundWorker
和 Task
都是执行此操作的合理方法。然后,您需要将任何 UI 更改返回到 UI 线程。
如果您使用了 async
(和 Tasks
),那么框架会为您做这件事。同样,如果您使用适当的 MVVM 模式,PropertyChanged
事件将自动编码到正确的线程上。
如果您不能以“正确”的方式做到这一点,则可以使用 Dispatcher.BeginInvoke
自行编码此类更改。
Dispatcher.BeginInvoke(new Action(() =>
{
//UI code ONLY
}), DispatcherPriority.Normal);
但这只是一个创可贴。转向异步或基于 MVVM 的代码(或者更好的是,两者兼而有之!)
关于C# WPF 窗口在 foreach 循环中不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31171169/