Browse Source

Disabled controls should lose focus and don't accept keyboard events

pull/9627/head
Daniil Pavliuchyk 4 years ago
parent
commit
80e1e1eb4c
  1. 18
      src/Avalonia.Base/Input/InputElement.cs
  2. 22
      tests/Avalonia.Controls.UnitTests/TextBoxTests.cs

18
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;
/// <summary>
/// Initializes static members of the <see cref="InputElement"/> 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);
}
}
}

22
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()
{

Loading…
Cancel
Save