我有一个简单的 WPF 窗口:Loaded="StartTest" 和<Grid> <ListBox ItemsSource="{Binding Logging, IsAsync=True}"></ListBox></Grid>在后面的代码中,我有方法StartTest:LogModel LogModel = new LogModel();void StartTest(object sender, RoutedEventArgs e){ DataContext = LogModel; for (int i = 1; i<= 10; i++) { LogModel.Add("Test"); Thread.Sleep(100); }}类LogModel是:public class LogModel : INotifyPropertyChanged{ public LogModel() { Dispatcher = Dispatcher.CurrentDispatcher; Logging = new ObservableCollection<string>(); } Dispatcher Dispatcher; public ObservableCollection<string> Logging { get; set; } public event PropertyChangedEventHandler PropertyChanged; public void Add(string text) { Dispatcher.BeginInvoke((Action)delegate () { Logging.Add(text); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Logging")); }); }}当然,问题是 UI 不会在循环中更新。我错过了什么?如何实现UI更新?
3 回答
![?](http://img1.sycdn.imooc.com/5333a1d100010c2602000200-100-100.jpg)
慕哥6287543
TA贡献1831条经验 获得超10个赞
UI 未在循环中更新的原因是对Dispatcher.BeginInvoke
. 这会DispatcherOperation
在调度程序队列中放置一个新的。但是你的循环已经是一个调度器操作,它继续在Dispatcher
的线程上。因此,您排队的所有操作都将在循环操作完成后执行。
也许你想StartTest
在后台线程上运行?然后,UI 将更新。
顺便说一句,不要用 阻塞Dispatcher
的线程Thread.Sleep
。它阻止Dispatcher
尽可能顺利地做它的事情。
![?](http://img1.sycdn.imooc.com/5458478b0001f01502200220-100-100.jpg)
慕婉清6462132
TA贡献1804条经验 获得超2个赞
它是DoEvents
一回事,overhere:
public static void DoEvents()
{
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,
new Action(delegate { }));
}
当然,应该以不需要它的方式编写不同的测试。
- 3 回答
- 0 关注
- 186 浏览
添加回答
举报
0/150
提交
取消