From 507bc51b595337a3d3db99eb3f72d2c77ba05112 Mon Sep 17 00:00:00 2001 From: Robbie Knuth Date: Mon, 19 Sep 2016 12:43:26 -0700 Subject: [PATCH] Handle special case of deleting carriage returns and linefeeds in multiline textboxes. --- src/Avalonia.Controls/TextBox.cs | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index ed73472c49..b86d3e0d4e 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -379,8 +379,20 @@ namespace Avalonia.Controls if (!DeleteSelection() && CaretIndex > 0) { - SetTextInternal(text.Substring(0, caretIndex - 1) + text.Substring(caretIndex)); - --CaretIndex; + var removedCharacters = 1; + // handle deleting /r/n + // you don't ever want to leave a dangling /r around. So, if deleting /n, check to see if + // a /r should also be deleted. + if (CaretIndex > 1 && + text[CaretIndex - 1] == '\n' && + text[CaretIndex - 2] == '\r') + { + removedCharacters = 2; + } + + SetTextInternal(text.Substring(0, caretIndex - removedCharacters) + text.Substring(caretIndex)); + CaretIndex -= removedCharacters; + SelectionStart = SelectionEnd = CaretIndex; } break; @@ -393,7 +405,18 @@ namespace Avalonia.Controls if (!DeleteSelection() && caretIndex < text.Length) { - SetTextInternal(text.Substring(0, caretIndex) + text.Substring(caretIndex + 1)); + var removedCharacters = 1; + // handle deleting /r/n + // you don't ever want to leave a dangling /r around. So, if deleting /n, check to see if + // a /r should also be deleted. + if (CaretIndex < text.Length - 1 && + text[caretIndex + 1] == '\n' && + text[caretIndex] == '\r') + { + removedCharacters = 2; + } + + SetTextInternal(text.Substring(0, caretIndex) + text.Substring(caretIndex + removedCharacters)); } break;