从Windows窗体应用程序打开另一个线程中的WPF窗口

时间:2009-04-08 11:30:29

标签: c# wpf winforms multithreading

好的,我应该首先说我不确定这是解决这个问题的正确方法,但是......

基本上我在WPF中创建了一个窗口,用于在我的应用程序中显示通知(有点像Outlook新邮件通知)。我想尝试在它自己的线程中显示这个窗口(它可能在将来做一些工作)。

我使用WPF创建了Window,因为它在处理AlwaysOnTop和淡入淡出等方面更加出色。

显示通知的应用程序是3.5 Windows窗体应用程序。我已经看到类似于这个SOF: C# winforms startup (Splash) form not hiding的示例,用于在不同的线程中显示一个Form但是我无法使用WPF窗口启动一个新的Message Loop。

我尝试在新线程中调用Notification.Show(),但Window永远不会显示。

  1. 是否可以在自己的帖子中显示此WPF?

  2. 为什么我看到一些资源说您不应该在单独的帖子中显示任何UI?

3 个答案:

答案 0 :(得分:15)

WPF Threading Model有详细说明。寻找“多个Windows,多个线程。”

基本上,你启动一个新线程,创建相关窗口,然后调用

System.Windows.Threading.Dispatcher.Run();

为了在新线程上运行该窗口的调度程序。

答案 1 :(得分:3)

  
      
  1. 是否可以在自己的主题中显示此WPF?
  2.   

绝对。只需创建一个新的STA线程,然后从中创建并显示Window。我已经将这种技术用于启动画面,因为主(UI)线程在执行其他操作时非常紧张。由于我们使用的第三方框架,完全无法控制在UI线程上完成了多少工作。

  
      
  1. 为什么我看到一些资源说您不应该在单独的线程中显示任何UI?
  2.   

可能是因为涉及额外的复杂性。如果你的一个Window想要将数据传递给另一个,你需要记住它们是在不同的线程上执行的。因此,每个人都应该使用其Dispatcher来调用正确的线程。

答案 2 :(得分:0)

您应该使用主UI线程显示通知,如果该窗口将执行任何工作,请在后台线程中运行该工作。您不应该使用多个线程来访问或创建UI对象,即使您没有在线程之间共享这些对象也是如此。