我的标签文本在我的3.5 WPF MVVM应用程序中没有正确更新。 do work部分持续时间足够长,你可以看到等待的鼠标指针。 我所看到的只是标签中的“Parsed”,它是绑定到InfoText。 Dispatcher和work工作线都在Command的方法中。 想法?
代码
Dispatcher.Invoke((Action<string>)SetInfoText, "Start Parsing");
//do work
Dispatcher.Invoke((Action<string>)SetInfoText, "Parsed");
private void SetInfoText(string text)
{
InfoText = text;
}
private string _infoText;
public string InfoText
{
get
{
return _infoText;
}
set
{
_infoText = value;
OnPropertyChanged("InfoText");
}
}
答案 0 :(得分:2)
我唯一能想到解释的是你在UI线程上做的工作。这将阻止调度程序重新绘制,直到您的工作完成。在Invoke中传递的工作被放置在事件队列中,这意味着它将在空闲时执行。
解决问题的正确方法是在单独的线程上完成工作。如果您正在寻找变通方法,look here。 参考:MSDN
编辑: 有很多方法可以在另一个线程上执行工作。阅读BackgroundWorker,ThreadPool,任务Parallell库,线程。 :) 这是在后台线程中完成工作的一种非常简单的方法:
System.Threading.ThreadPool.QueueUserWorkItem( state =>
{
Dispatcher.Invoke((Action<string>)SetInfoText, "Start Parsing");
System.Threading.Thread.Sleep(5000); // Simulate work
Dispatcher.Invoke((Action<string>)SetInfoText, "Parsed");
});
答案 1 :(得分:0)
Application.Current.Dispatcher.BeginInvoke(new Action(() => this.InfoText="Start Parsing"));
这适合我。
然而,我会把我长期运作的过程放在后台工作中。所以ui线程不会被阻止。编辑:如果你在ui线程中完成所有工作,你应该查看BeginInvoke的重载 - 你可以传递一个DispatcherPriority。可能这也有帮助