wpf:通过调度程序更新多个控件
我正在使用 SerialPort 类中的事件侦听器从串行端口读取数据。 在我的事件处理程序中,我需要使用通过串行端口传入的 xml 数据来更新窗口中的许多 (30-40) 控件。
我知道我必须使用 myControl.Dispatcher.Invoke() 来更新它,因为它位于不同的线程上,但是有没有办法一起更新大量控件,而不是为每个控件进行单独的 Invoke 调用(即 myCon1.Dispatcher. Invoke()、myCon2.Dispatcher.Invoke() 等)?
我正在寻找诸如在容器上调用 Invoke 并单独更新每个子控件之类的东西,但我似乎无法弄清楚如何完成此操作。
谢谢!
I'm reading data from a serial port using an event listener from the SerialPort class. In my event handler, I need to update many (30-40) controls in my window with xml data coming over the serial port.
I know that I must use myControl.Dispatcher.Invoke() to update it since it's on a different thread, but is there a way to update lots of controls together, rather than doing a separate Invoke call for each (i.e. myCon1.Dispatcher.Invoke(), myCon2.Dispatcher.Invoke(), etc)?
I'm looking for something like calling Invoke on the container, and updating each child control individually, but I can't seem to work out how to accomplish this.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您需要做的是使用 MVVM。
您将控件绑定到 ViewModel 上的公共属性。 您的 VM 可以侦听串行端口、解析 xml 数据、更新其公共属性,然后使用 INotifyPropertyChanged 告诉 UI 更新其绑定。
我建议您采用此路线,因为您可以批量通知,并且如果必须的话,可以使用 Dispatcher 在 UI 线程上调用事件。
UI:
SerialWindowViewModel:
并且,如果这对您来说不可接受(并且您想要像 winforms 应用程序一样对 WPF 进行编程),您可以在手动更新表单上的所有控件时使用 Dispatcher.CurrentDispatcher 调用一次。 但这个方法很臭。
What you need to do is use MVVM.
You bind your controls to public properties on a ViewModel. Your VM can listen to the serial port, parse out the xml data, update its public properties, and then use INotifyPropertyChanged to tell the UI to update its bindings.
I'd suggest this route as you can batch notifications and, if you have to, use the Dispatcher to invoke the event on the UI thread.
UI:
SerialWindowViewModel:
And, if that isn't acceptable to you (and you want to program WPF like its a winforms app) you can use Dispatcher.CurrentDispatcher to Invoke once while you manually update all controls on your form. But that method stinks.