From 82483d7dec6e906c4764c6123133648049ccd932 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 21 Jun 2017 09:57:39 +0200 Subject: [PATCH] Fix exception in ToolTip. Make sure old `ToolTip` is disposed before showing a new one. --- src/Avalonia.Controls/ToolTip.cs | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/Avalonia.Controls/ToolTip.cs b/src/Avalonia.Controls/ToolTip.cs index b8896a3acf..fef10d3510 100644 --- a/src/Avalonia.Controls/ToolTip.cs +++ b/src/Avalonia.Controls/ToolTip.cs @@ -105,13 +105,10 @@ namespace Avalonia.Controls { if (control != null && control.IsVisible && control.GetVisualRoot() != null) { - if (s_popup != null) - { - throw new AvaloniaInternalException("Previous ToolTip not disposed."); - } var cp = (control.GetVisualRoot() as IInputRoot)?.MouseDevice?.GetPosition(control); var position = control.PointToScreen(cp ?? new Point(0, 0)) + new Vector(0, 22); + DisposeTooltip(); s_popup = new PopupRoot(); ((ISetLogicalParent)s_popup).SetParent(control); s_popup.Content = new ToolTip { Content = GetTip(control) }; @@ -144,18 +141,22 @@ namespace Avalonia.Controls if (control == s_current) { - if (s_popup != null) - { - // Clear the ToolTip's Content in case it has control content: this will - // reset its visual parent allowing it to be used again. - ((ToolTip)s_popup.Content).Content = null; + DisposeTooltip(); + s_show.OnNext(null); + } + } - // Dispose of the popup. - s_popup.Dispose(); - s_popup = null; - } + private static void DisposeTooltip() + { + if (s_popup != null) + { + // Clear the ToolTip's Content in case it has control content: this will + // reset its visual parent allowing it to be used again. + ((ToolTip)s_popup.Content).Content = null; - s_show.OnNext(null); + // Dispose of the popup. + s_popup.Dispose(); + s_popup = null; } } }