好的,我应该首先说我不确定这是解决这个问题的正确方法,但是......
基本上我在WPF中创建了一个窗口,用于在我的应用程序中显示通知(有点像Outlook新邮件通知)。我想尝试在它自己的线程中显示这个窗口(它可能在将来做一些工作)。
我使用WPF创建了Window,因为它在处理AlwaysOnTop和淡入淡出等方面更加出色。
显示通知的应用程序是3.5 Windows窗体应用程序。我已经看到类似于这个SOF: C# winforms startup (Splash) form not hiding的示例,用于在不同的线程中显示一个Form但是我无法使用WPF窗口启动一个新的Message Loop。
我尝试在新线程中调用Notification.Show(),但Window永远不会显示。
是否可以在自己的帖子中显示此WPF?
为什么我看到一些资源说您不应该在单独的帖子中显示任何UI?
答案 0 :(得分:15)
WPF Threading Model有详细说明。寻找“多个Windows,多个线程。”
基本上,你启动一个新线程,创建相关窗口,然后调用
System.Windows.Threading.Dispatcher.Run();
为了在新线程上运行该窗口的调度程序。
答案 1 :(得分:3)
- 是否可以在自己的主题中显示此WPF?
醇>
绝对。只需创建一个新的STA线程,然后从中创建并显示Window
。我已经将这种技术用于启动画面,因为主(UI)线程在执行其他操作时非常紧张。由于我们使用的第三方框架,完全无法控制在UI线程上完成了多少工作。
- 为什么我看到一些资源说您不应该在单独的线程中显示任何UI?
醇>
可能是因为涉及额外的复杂性。如果你的一个Window
想要将数据传递给另一个,你需要记住它们是在不同的线程上执行的。因此,每个人都应该使用其Dispatcher来调用正确的线程。
答案 2 :(得分:0)
您应该使用主UI线程显示通知,如果该窗口将执行任何工作,请在后台线程中运行该工作。您不应该使用多个线程来访问或创建UI对象,即使您没有在线程之间共享这些对象也是如此。