Browse Source

Set IsKeyboardFocusWithin to false when control is detached from visual tree (#19369)

* add failing IsKeyboardFocusWithin test for popup

* Set IsKeyboardWithin to false when detached from visual tree
release/11.3.3
Emmanuel Hansen 8 months ago
committed by Julien Lebosquain
parent
commit
5a1476375f
  1. 2
      src/Avalonia.Base/Input/InputElement.cs
  2. 45
      tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs

2
src/Avalonia.Base/Input/InputElement.cs

@ -515,6 +515,8 @@ namespace Avalonia.Input
{
FocusManager.GetFocusManager(this)?.ClearFocusOnElementRemoved(this, e.Parent);
}
IsKeyboardFocusWithin = false;
}
/// <summary>

45
tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs

@ -669,6 +669,51 @@ namespace Avalonia.Controls.UnitTests.Primitives
}
}
[Fact]
public void Popup_Should_Clear_Keyboard_Focus_From_Children_When_Closed()
{
using (CreateServicesWithFocus())
{
var winButton = new Button();
var window = PreparedWindow(new Panel { Children = { winButton }});
var border1 = new Border();
var border2 = new Border();
var button = new Button();
border1.Child = border2;
border2.Child = button;
var popup = new Popup
{
PlacementTarget = window,
Child = new StackPanel
{
Children =
{
border1
}
}
};
((ISetLogicalParent)popup).SetParent(popup.PlacementTarget);
window.Show();
winButton.Focus();
popup.Open();
button.Focus();
var inputRoot = Assert.IsAssignableFrom<IInputRoot>(popup.Host);
var focusManager = inputRoot.FocusManager!;
Assert.Same(button, focusManager.GetFocusedElement());
border1.Child = null;
winButton.Focus();
Assert.False(border2.IsKeyboardFocusWithin);
}
}
[Fact]
public void Closing_Popup_Sets_Focus_On_PlacementTarget()
{

Loading…
Cancel
Save