Browse Source

Merge pull request #4296 from AvaloniaUI/fixes/tooltip-must-close-when-detached-from-visual-tree

Fixes/tooltip must close when detached from visual tree
stable/0.9
danwalmsley 6 years ago
committed by Dan Walmsley
parent
commit
0a7d61bb6d
  1. 8
      src/Avalonia.Controls/ToolTipService.cs
  2. 34
      tests/Avalonia.Controls.UnitTests/ToolTipTests.cs

8
src/Avalonia.Controls/ToolTipService.cs

@ -28,14 +28,22 @@ namespace Avalonia.Controls
{ {
control.PointerEnter -= ControlPointerEnter; control.PointerEnter -= ControlPointerEnter;
control.PointerLeave -= ControlPointerLeave; control.PointerLeave -= ControlPointerLeave;
control.DetachedFromVisualTree -= ControlDetaching;
} }
if (e.NewValue != null) if (e.NewValue != null)
{ {
control.PointerEnter += ControlPointerEnter; control.PointerEnter += ControlPointerEnter;
control.PointerLeave += ControlPointerLeave; control.PointerLeave += ControlPointerLeave;
control.DetachedFromVisualTree += ControlDetaching;
} }
} }
private void ControlDetaching(object sender, VisualTreeAttachmentEventArgs e)
{
var control = (Control)sender;
Close(control);
}
/// <summary> /// <summary>
/// Called when the pointer enters a control with an attached tooltip. /// Called when the pointer enters a control with an attached tooltip.

34
tests/Avalonia.Controls.UnitTests/ToolTipTests.cs

@ -33,6 +33,40 @@ namespace Avalonia.Controls.UnitTests
Assert.False(ToolTip.GetIsOpen(control)); Assert.False(ToolTip.GetIsOpen(control));
} }
[Fact]
public void Should_Close_When_Control_Detaches()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var window = new Window();
var panel = new Panel();
var target = new Decorator()
{
[ToolTip.TipProperty] = "Tip",
[ToolTip.ShowDelayProperty] = 0
};
panel.Children.Add(target);
window.Content = panel;
window.ApplyTemplate();
window.Presenter.ApplyTemplate();
Assert.True((target as IVisual).IsAttachedToVisualTree);
_mouseHelper.Enter(target);
Assert.True(ToolTip.GetIsOpen(target));
panel.Children.Remove(target);
Assert.False(ToolTip.GetIsOpen(target));
}
}
[Fact] [Fact]
public void Should_Open_On_Pointer_Enter() public void Should_Open_On_Pointer_Enter()

Loading…
Cancel
Save