From b3f4e4d63ef6f2a0bd61a830523016b83b7ff5a2 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 15 Feb 2021 13:54:16 +0100 Subject: [PATCH 1/2] Added failing test for #4906. --- .../InputElement_Focus.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/Avalonia.Input.UnitTests/InputElement_Focus.cs b/tests/Avalonia.Input.UnitTests/InputElement_Focus.cs index 8b8f2fa775..602455ba36 100644 --- a/tests/Avalonia.Input.UnitTests/InputElement_Focus.cs +++ b/tests/Avalonia.Input.UnitTests/InputElement_Focus.cs @@ -318,5 +318,24 @@ namespace Avalonia.Input.UnitTests Assert.True(root2.IsKeyboardFocusWithin); } } + + [Fact] + public void Can_Clear_Focus() + { + Button target; + + using (UnitTestApplication.Start(TestServices.RealFocus)) + { + var root = new TestRoot + { + Child = target = new Button() + }; + + target.Focus(); + FocusManager.Instance.Focus(null); + + Assert.Null(FocusManager.Instance.Current); + } + } } } From 06307865dc7a99661de1cbfd25a3c148bd90f42f Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 15 Feb 2021 13:54:42 +0100 Subject: [PATCH 2/2] When clearing focus don't reselect the existing focus scope. Fixes #4906. --- src/Avalonia.Input/FocusManager.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Input/FocusManager.cs b/src/Avalonia.Input/FocusManager.cs index a1f1478f51..474b212a21 100644 --- a/src/Avalonia.Input/FocusManager.cs +++ b/src/Avalonia.Input/FocusManager.cs @@ -75,7 +75,9 @@ namespace Avalonia.Input // If control is null, set focus to the topmost focus scope. foreach (var scope in GetFocusScopeAncestors(Current).Reverse().ToList()) { - if (_focusScopes.TryGetValue(scope, out var element) && element != null) + if (scope != Scope && + _focusScopes.TryGetValue(scope, out var element) && + element != null) { Focus(element, method); return;