From 3e7910f3ed58b96d96b06c0e4e18539fa9b82e11 Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Thu, 27 Jun 2024 00:00:38 +0200 Subject: [PATCH] Use TextLine.GetBackspaceCaretCharacterHit for the backspace delete handling (#16135) --- src/Avalonia.Controls/TextBox.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index 699a13aae8..a627c15765 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -1442,6 +1442,17 @@ namespace Avalonia.Controls var backspacePosition = characterHit.FirstCharacterIndex + characterHit.TrailingLength; + var lineIndex = _presenter.TextLayout.GetLineIndexFromCharacterIndex(caretIndex, true); + + var backspaceCharacterHit = _presenter.TextLayout.TextLines[lineIndex] + .GetBackspaceCaretCharacterHit(new CharacterHit(caretIndex)); + + if (backspaceCharacterHit.FirstCharacterIndex > backspacePosition && + backspaceCharacterHit.FirstCharacterIndex < caretIndex) + { + backspacePosition = backspaceCharacterHit.FirstCharacterIndex; + } + if (caretIndex != backspacePosition) { var start = Math.Min(backspacePosition, caretIndex); @@ -1456,6 +1467,8 @@ namespace Avalonia.Controls SetCurrentValue(TextProperty, StringBuilderCache.GetStringAndRelease(sb)); SetCurrentValue(CaretIndexProperty, start); + + _presenter.MoveCaretToTextPosition(start, true); } }