我有一个执行以下操作的程序:
代码是
UserControl1 control = new UserControl1();
control.AddFormsHostWithDelay(TimeSpan.FromSeconds(2));;
if (this.TryGetHandleFromName("Notepad", out IntPtr handle))
{
HwndSourceParameters pa = new HwndSourceParameters("WPF Source", 400, 300);
pa.ParentWindow = handle;
pa.WindowStyle = 0x40000000 | 0x10000000; // child and visible
pa.UsesPerPixelOpacity = false;
pa.SetPosition(5, 5);
HwndSource src = new HwndSource(pa);
src.RootVisual = control;
}
该代码工作多年,但自Windows10 CreatorsUpdate以来,一旦添加了WindowsFormsHost,它就会崩溃。消息和堆栈跟踪是
'CreatorsUpdateCrashDemo.exe' (CLR v4.0.30319:
CreatorsUpdateCrashDemo.exe): Loaded 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\PrivateAssemblies\Runtime\Microsoft.VisualStudio.Debugger.Runtime.dll'.
Unhandled Exception: System.InvalidOperationException: Hosted HWND must be a child window of the specified parent.
at System.Windows.Interop.HwndHost.BuildWindow(HandleRef hwndParent)
at System.Windows.Interop.HwndHost.BuildOrReparentWindow()
at System.Windows.Interop.HwndHost.OnSourceChanged(Object sender, SourceChangedEventArgs e)
可在http://www.seetec.eu/entwicklung/BRAU/CreatorsUpdateCrash.zip
找到完整演示如何重现:
有人知道要改变什么来避免这次崩溃吗?在进行重新显示之前添加FormsHost可以解决问题,但在实际应用程序中是不可能的。
其他信息:
问题显然在WindowsFormsHost中。使用CreatorsUpdate更改了BuildWindowCore方法中的某些内容。在HwndHost.BuildWindow中调用BuildWindowCore后,有一些检查,其中一个失败。特别是HwndHost中的代码:
// Make sure the child window is the child of the expected parent window.
if(hwndParent.Handle != UnsafeNativeMethods.GetParent(_hwnd))
{
throw new InvalidOperationException(SR.Get(SRID.ChildWindowMustHaveCorrectParent));
}
更多附加信息:我发现设置"覆盖高dpi缩放行为"在可执行文件的属性中解决了问题。这可能是一种解决方法,但我仍然想了解发生了什么。我所做的只是不支持吗?有没有更好的方法呢?
答案 0 :(得分:0)
在您的计算机和解决方案上更新.Net Framework,不要忘记NuGet更新。