Browse Source

Fix exception in ToolTip.

Make sure old `ToolTip` is disposed before showing a new one.
pull/1031/head
Steven Kirk 9 years ago
parent
commit
82483d7dec
  1. 29
      src/Avalonia.Controls/ToolTip.cs

29
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;
}
}
}

Loading…
Cancel
Save