From 80e1e1eb4cfb544a89e12c07ae56a994bfb37490 Mon Sep 17 00:00:00 2001 From: Daniil Pavliuchyk Date: Mon, 5 Dec 2022 18:53:24 +0200 Subject: [PATCH] Disabled controls should lose focus and don't accept keyboard events --- src/Avalonia.Base/Input/InputElement.cs | 18 +++++++++++++++ .../TextBoxTests.cs | 22 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/Avalonia.Base/Input/InputElement.cs b/src/Avalonia.Base/Input/InputElement.cs index d0130258c3..60d8ef87a3 100644 --- a/src/Avalonia.Base/Input/InputElement.cs +++ b/src/Avalonia.Base/Input/InputElement.cs @@ -199,6 +199,7 @@ namespace Avalonia.Input private bool _isFocusVisible; private bool _isPointerOver; private GestureRecognizerCollection? _gestureRecognizers; + private bool _restoreFocus; /// /// Initializes static members of the class. @@ -442,6 +443,23 @@ namespace Avalonia.Input { SetAndRaise(IsEffectivelyEnabledProperty, ref _isEffectivelyEnabled, value); PseudoClasses.Set(":disabled", !value); + + if (!IsEffectivelyEnabled) + { + if (FocusManager.Instance?.Current == this) + { + _restoreFocus = true; + FocusManager.Instance?.Focus(null); + } + else + { + _restoreFocus = false; + } + } + else if (IsEffectivelyEnabled && _restoreFocus) + { + FocusManager.Instance?.Focus(this); + } } } diff --git a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs index 6b9105ccb5..bd6d5d55e2 100644 --- a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs @@ -59,6 +59,28 @@ namespace Avalonia.Controls.UnitTests } } + [Fact] + public void TextBox_Should_Lose_Focus_When_Disabled() + { + using (UnitTestApplication.Start(FocusServices)) + { + var target = new TextBox + { + Template = CreateTemplate() + }; + + target.ApplyTemplate(); + + var root = new TestRoot() { Child = target }; + + target.Focus(); + Assert.True(target.IsFocused); + target.IsEnabled = false; + Assert.False(target.IsFocused); + Assert.False(target.IsEnabled); + } + } + [Fact] public void Opening_Context_Flyout_Does_not_Lose_Selection() {