如何 运行 一个 window 进入一个新任务并保持其主线程 运行ning

How to run a window into a new task and keep its main thread running

正在开发 WPF/MVVM 应用程序。 将主线程中的 MVC window 显示到新任务中并让主线程保持 运行 下一条指令而不等待 window 关闭的最佳方法是什么?

我想运行以下内容:

  Window window = new Window();
    View view = new View();
    ViewModel viewModel = new ViewModel();
    window.Content = view;

window.Show();

... program then continues with business stuff

显然,如果我 运行

 window.Show();

window立即returns并关闭。

如果我用

 window.ShowDialog()

线程等待 window 被用户关闭,这不是我想要的,因为我需要下一条指令才能继续。

我想我需要 运行 将 window 放入一个新线程,但这会带来额外的问题:

 Task.Run(() => window.ShowDialog())); 

这也不起作用,因为 window 被创建为不同的东西。

所以我想我需要使用调度程序才能在新任务中 运行 window.ShowDialog:

Task.Run(() => Application.Current.Dispatcher.Invoke(() => window.ShowDialog() ));

但这也不管用。虽然编译器接受它并且它不会在 运行 时抛出异常,但 window 永远不会打开。如果我在逐步模式下调试,我可以看到调试器永远不会在新任务中进入 then anonymous。

这应该很简单,但我就是没能解决这个问题。 感谢您提前提供的帮助。

Window.Show() 不会阻塞线程。它也不会立即 return 直到用户关闭另一个 window (或者您以编程方式关闭它)。所以这可能就是你想要的。

如果您想为 Main window 和 MVC window 设置单独的 UI 线程,您可以在另一个线程中启动新的 Window 并执行新 UI 线程的必要管道。

var thread = new Thread(() =>
                        {
                            SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher));

                            Window window = new Window();
                            View view = new View();
                            ViewModel viewModel = new ViewModel();
                            window.Content = view;

                            // When the window closes, shut down the dispatcher
                            window.Closed += (s, args) =>
                                                 Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);

                            window.Show();

                            // Start the Dispatcher Processing
                            Dispatcher.Run();
                        });
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

有关详细信息,请参阅 this blog post from @Reed Copsey