diff --git a/src/Avalonia.Base/Input/InputElement.cs b/src/Avalonia.Base/Input/InputElement.cs index 3afc42bd02..20f510efa6 100644 --- a/src/Avalonia.Base/Input/InputElement.cs +++ b/src/Avalonia.Base/Input/InputElement.cs @@ -706,9 +706,19 @@ namespace Avalonia.Input { PseudoClasses.Set(":focus-within", change.GetNewValue()); } - else if (change.Property == IsVisibleProperty && !change.GetNewValue() && IsFocused) + else if (change.Property == IsVisibleProperty) { - FocusManager.GetFocusManager(this)?.ClearFocus(); + if (!change.GetNewValue() && IsKeyboardFocusWithin && FocusManager.GetFocusManager(this) is { } focusManager) + { + if (focusManager.GetFocusedElement() is { } focusedElement && VisualParent != null) + { + focusManager.ClearFocusOnElementRemoved(focusedElement, VisualParent); + } + else + { + focusManager.ClearFocus(); + } + } } } diff --git a/tests/Avalonia.Base.UnitTests/Input/InputElement_Focus.cs b/tests/Avalonia.Base.UnitTests/Input/InputElement_Focus.cs index 85d2be077f..69cc3dbc22 100644 --- a/tests/Avalonia.Base.UnitTests/Input/InputElement_Focus.cs +++ b/tests/Avalonia.Base.UnitTests/Input/InputElement_Focus.cs @@ -203,7 +203,7 @@ namespace Avalonia.Base.UnitTests.Input } } - [Fact(Skip = "Need to implement IsEffectivelyVisible change notifications.")] + [Fact] public void Focus_Should_Be_Cleared_When_Control_Is_Effectively_Hidden() { Border container;