首页 > 解决方案 > 使用 XAML 托管 API 在单独的线程上打开对话框时出现问题

问题描述

我的 WPF 项目通过使用 WPF 工具包的 WindowsXamlHost 控件来使用新的 XAML 岛。

直到我不得不创建一个新的对话框窗口,在新窗口中嵌入了另一个 WindowsXamlHost,它对我来说效果很好。我收到一个错误“AttachToWindow 方法失败,因为指定的 HWND 来自与先前传递的 HWND 不同的顶级窗口”(更多详细信息)。

所以为了解决这个问题,我必须使用单独的线程打开这个对话框窗口。

Thread windowThread = new Thread(delegate ()
{
    SynchronizationContext.SetSynchronizationContext(
        new DispatcherSynchronizationContext(
            Dispatcher.CurrentDispatcher));

    SettingsDialogWindow dialog = new SettingsDialogWindow()
    {
    };
    dialog.Closed += (s, args) => Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);
    dialog.Show();
    Dispatcher.Run();

});
windowThread.SetApartmentState(ApartmentState.STA);
windowThread.Start();

但现在我在关闭此窗口并终止线程时遇到问题。我收到另一个错误“MyApp.WPF.Core.exe 中 0x74865D0B (ucrtbase.dll) 处的未处理异常:请求致命程序退出。”

如何正确退出此窗口并终止线程?如果我删除 WindowsXamlHost,代码片段可以正常工作:

    <uwpHost:WindowsXamlHost Panel.ZIndex="0"
    Grid.Row="0"
    ChildChanged="WindowsXamlHost_ChildChanged"
    InitialTypeName="MyApp.UWP.Views.Core.SettingsUserControl"/>

标签: c#multithreadinguwp-xamldesktop-bridgewindows-community-toolkit

解决方案


推荐阅读