在另一个Thread中创建WPF元素

时间:2010-09-13 09:55:59

标签: wpf multithreading

我可以在不同的线程上运行2个或更多WPF窗口。 问题是现在我的应用程序在许多窗口中分裂了。

我真正想要的是一个包含网格的主窗口,其中每个单元格都包含一个由不同线程管理的元素。

是否可以创建由不是管理父/包含窗口的线程管理的UIElement / Component?

是否可以封装在某个框架/ UIElement中的不同线程上运行的窗口?

由于


是否可以使用MediaElement将窗口投影到Panel?

2 个答案:

答案 0 :(得分:1)

这在WPF中是不可能的,即使它是一个坏主意:

  1. 在WPF中是不可能的,因为WPF元素只能由创建它们的线程使用,如果你从另一个线程中添加一个他们无法通信的子元素。

  2. 在纯Win32中它是可能的 - 但是它加入了两个线程的消息队列,所以线程不再是独立的(所以即使你发现一个使它与WPF一起工作的hack它仍然没有帮助你)

  3. 任何具有UI并执行长时间运行任务的线程都可以挂起整个系统 - 因此无法在UI线程中执行任何长时间运行的任务 - 而是在后台线程中运行长任务

  4. 因为您必须保持UI线程的响应 - >它应该永远不会忙碌一段时间 - >它可以处理你所有的窗户,因为它不太忙。

答案 1 :(得分:1)

“我真正想要的是有一个包含网格的主窗口,其中每个单元格都包含一个由不同线程管理的元素。”

解决此问题的一种方法是在单元格中正常创建元素。创建一个常规类ViewModel,它不会触及UI,而是在它自己的线程上运行。这个课程是你在细胞中实际尝试做的事情背后的大脑,而不是你想要在你的细胞中展示的东西。此ViewModel类应在其数据更新时实现INotifyPropertyChanged。在MainWindow.cs文件中,您可以将单元格元素的DataContext设置为这些ViewModel。最后,在您的XAML中,您可以使用ViewModel中的“属性”绑定要尝试显示的内容。

我知道我轻松了解了很多细节,但这是一个起点。如果您需要,可以在这里获得很多帮助。