From 8b0222133a72028148a7f329fb36eb1fe7227c68 Mon Sep 17 00:00:00 2001 From: Curtis Wensley Date: Wed, 2 Oct 2024 09:47:12 -0700 Subject: [PATCH] Wpf: Clear owner before setting Visible to false --- src/Eto.Wpf/Forms/WpfWindow.cs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/Eto.Wpf/Forms/WpfWindow.cs b/src/Eto.Wpf/Forms/WpfWindow.cs index 56fc96a07..f7b4fc6c4 100755 --- a/src/Eto.Wpf/Forms/WpfWindow.cs +++ b/src/Eto.Wpf/Forms/WpfWindow.cs @@ -1079,18 +1079,21 @@ public void SetOwner(Window owner) { if (owner == null) { + // Clear out WPF owner Control.Owner = null; - return; + + // If the owner was set to an HWND clear that out too. + var interop = windowInterop ?? new sw.Interop.WindowInteropHelper(Control); + interop.Owner = IntPtr.Zero; } - var wpfWindow = owner.Handler as IWpfWindow; - if (wpfWindow != null) + else if (owner.Handler is IWpfWindow wpfWindow) + { + // Owner could be an HwndWindowHandler (or other) which sets owner differently wpfWindow.SetOwnerFor(Control); + } } - public double WpfScale - { - get { return dpiHelper?.WpfScale ?? 1f; } - } + public double WpfScale => dpiHelper?.WpfScale ?? 1f; public float LogicalPixelSize { @@ -1119,10 +1122,18 @@ public override bool Visible set { if (value) + { + // set owner back if we weren't visible beforehand + SetOwner(Widget.Owner); Control.Show(); + } else + { + // hiding will hide entire owner chain, so clear that out before making it invisible. + SetOwner(null); Control.Hide(); } } } } +}