Browse Source

Fix caret position after backspace (#16712)

* Added failing test for caret position after backspace

* Fix incorrect caret position after backspace
pull/16705/head
Julien Lebosquain 2 years ago
committed by GitHub
parent
commit
21d8cea26b
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      src/Avalonia.Controls/TextBox.cs
  2. 37
      tests/Avalonia.Controls.UnitTests/TextBoxTests.cs

2
src/Avalonia.Controls/TextBox.cs

@ -1468,7 +1468,7 @@ namespace Avalonia.Controls
SetCurrentValue(CaretIndexProperty, start);
_presenter.MoveCaretToTextPosition(start, true);
_presenter.MoveCaretToTextPosition(start);
}
}

37
tests/Avalonia.Controls.UnitTests/TextBoxTests.cs

@ -1492,6 +1492,43 @@ namespace Avalonia.Controls.UnitTests
}
}
[Fact]
public void Backspace_Should_Delete_Last_Character_In_Line_And_Keep_Caret_On_Same_Line()
{
using var _ = UnitTestApplication.Start(Services);
var textBox = new TextBox
{
Template = CreateTemplate(),
Text = "a\nb",
CaretIndex = 3
};
textBox.ApplyTemplate();
var topLevel = new TestTopLevel(CreateMockTopLevelImpl().Object)
{
Template = CreateTopLevelTemplate(),
Content = textBox
};
topLevel.ApplyTemplate();
topLevel.LayoutManager.ExecuteInitialLayoutPass();
var textPresenter = textBox.FindDescendantOfType<TextPresenter>();
Assert.NotNull(textPresenter);
var oldCaretY = textPresenter.GetCursorRectangle().Top;
Assert.NotEqual(0, oldCaretY);
RaiseKeyEvent(textBox, Key.Back, KeyModifiers.None);
Assert.Equal("a\n", textBox.Text);
Assert.Equal(2, textBox.CaretIndex);
Assert.Equal(2, textPresenter.CaretIndex);
var caretY = textPresenter.GetCursorRectangle().Top;
Assert.Equal(oldCaretY, caretY);
}
private static TestServices FocusServices => TestServices.MockThreadingInterface.With(
focusManager: new FocusManager(),
keyboardDevice: () => new KeyboardDevice(),

Loading…
Cancel
Save