diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index c2f496287c..394699ce64 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -573,15 +573,15 @@ namespace Avalonia.Controls switch (e.Key) { case Key.Left: - MoveHorizontal(-1, hasWholeWordModifiers); - movement = true; selection = DetectSelection(); + MoveHorizontal(-1, hasWholeWordModifiers, selection); + movement = true; break; case Key.Right: - MoveHorizontal(1, hasWholeWordModifiers); - movement = true; selection = DetectSelection(); + MoveHorizontal(1, hasWholeWordModifiers, selection); + movement = true; break; case Key.Up: @@ -826,13 +826,21 @@ namespace Avalonia.Controls return result; } - private void MoveHorizontal(int direction, bool wholeWord) + private void MoveHorizontal(int direction, bool wholeWord, bool isSelecting) { var text = Text ?? string.Empty; var caretIndex = CaretIndex; if (!wholeWord) { + if (SelectionStart != SelectionEnd && !isSelecting) + { + var start = Math.Min(SelectionStart, SelectionEnd); + var end = Math.Max(SelectionStart, SelectionEnd); + CaretIndex = direction < 0 ? start : end; + return; + } + var index = caretIndex + direction; if (index < 0 || index > text.Length) @@ -1049,14 +1057,14 @@ namespace Avalonia.Controls private void SetSelectionForControlBackspace() { SelectionStart = CaretIndex; - MoveHorizontal(-1, true); + MoveHorizontal(-1, true, false); SelectionEnd = CaretIndex; } private void SetSelectionForControlDelete() { SelectionStart = CaretIndex; - MoveHorizontal(1, true); + MoveHorizontal(1, true, false); SelectionEnd = CaretIndex; }