0

我在一个单独的线程中打开一个 wpf UI 使用

helperThread = new Thread(() =>
{
     //ShowHelpInDialog(e.Url, -1, -1, -1, -1, e.HelpContext);
     //System.Windows.Threading.Dispatcher.Run();
     dispatcher.Invoke(new Action(() => ShowHelpInDialog(e.Url, -1, -1, -1, -1, e.HelpContext)));

});
helperThread.SetApartmentState(ApartmentState.STA);
helperThread.IsBackground = true;
helperThread.Start();

在对话框关闭事件期间,我正在调用

Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);

这导致主线程/应用程序关闭,这是我不想要的。

我不希望我的父应用程序关闭。

4

2 回答 2

1

请注意以下示例,了解如何Window从另一个线程打开一个新线程:

private void NewWindowHandler(object sender, RoutedEventArgs e)
{       
    Thread newWindowThread = new Thread(new ThreadStart(ThreadStartingPoint));
    newWindowThread.SetApartmentState(ApartmentState.STA);
    newWindowThread.IsBackground = true;
    newWindowThread.Start();
}

private void ThreadStartingPoint()
{
    Window1 tempWindow = new Window1();
    tempWindow.Show();       
    System.Windows.Threading.Dispatcher.Run();
}

Threading Model来自MSDN 页面的 Multiple Windows, Multiple Threads 部分。

更新>>>

此代码经过 100% 测试,肯定会Window在新线程中打开一个新代码。如果您不想关闭另一个Window,则不要调用BeginInvokeShutdown将关闭的方法Window。您正在调用它,Dispatcher.CurrentDispatcher它在 MAIN 线程(MainWindow.xaml正在运行的地方)上运行。

于 2013-09-04T11:57:13.870 回答
1

您必须BeginInvokeShutdown在对话框的Dispatchernot on 上调用Dispatcher.CurrentDispatcher

您的对话框关闭事件处理程序应如下所示:

dialog.Closed += (sender, e) => dialog.Dispatcher.BeginInvokeShutdown();
于 2013-09-04T12:40:15.910 回答