WPF线程安​​全和页面之间的通信

Posted

技术标签:

【中文标题】WPF线程安​​全和页面之间的通信【英文标题】:WPF thread safety and communication between pages 【发布时间】:2022-01-20 04:46:34 【问题描述】:

我是 C# 和 .Net 的新手,我对 WPF 线程安全以及不同的 WPF 页面应该如何相互通信有一些疑问。我的主要项目将有一个名为MainWindow.csMainWndow.xaml 的类。此外,我将有两个页面称为Page1.csPage1.xamlPage2.csPage2.xaml。阅读文档,我知道每个 WPF 页面都有自己的线程,并且 WPF 的所有控件只能通过同一个线程访问,如果我在同一页面中有一个后台线程,我可以在后台访问 WPF 的控件遍历下面的例子

controlName.Dispatcher.Invoke(()=>updateControl())

我的问题是如果同样的操作,我想从Page1.cs类做改变例如 MainWndow.xamlPage2.xaml 上的文本框。如何安全地完成这些操作?

【问题讨论】:

【参考方案1】:

阅读文档,我知道每个 WPF 页面都有自己的线程

这是不正确的,或者至少是误导性的。每个 WPF 控件都有一个拥有所述控件的线程,并且所有访问都必须从该线程完成。但在大多数情况下,拥有所有控件的是同一个线程。所以不用担心线程安全。

可以有多个窗口由不同的 UI 线程拥有,但很少推荐这样做,因为线程安全和同步的所有问题。

因此,除非您正在做一些不常见的事情,否则您只需要关心您是在单个 UI 线程还是在后台线程上运行。

【讨论】:

【参考方案2】:

尝试查看INotifyPropertyChanged,如果您打算使用 WPF 做一些项目,我还建议您查看 MVVM Pattern

【讨论】:

以上是关于WPF线程安​​全和页面之间的通信的主要内容,如果未能解决你的问题,请参考以下文章

wpf 怎么实现 窗口和窗口之间的传值?页面和页面之间?窗口和页面之间?

WPF 中页面和窗口之间的导航

页面(视图)之间的 C# WPF 导航

WPF学习之旅---页面布局

如何实现electron多页面间通信

wpf combobox 页面上怎么绑定值