Как перемещать текст в AvalonEdit как в VisualStudio
Прошу помочь в написании функции для AvalonEdit
по перемещению (вверх или вниз) текста (выделенного или без выделения)
на подобие того как это реализовано в VisualStudio
с использованием горячих клавиш - Alt + Стрелка.Вниз или Стрелка.Вверх
Особенности реализации
- Если текст выделен - перемещать текст с сохранением выделения
- Если нет выделенного участка текста - перемещать текущую строку
- Ограничение перемещения текста по границам текста в AvalonEdit
Ответы (1 шт):
Автор решения: Kriss_Kross
→ Ссылка
Спасибо Alexander Petrov
Часть кода Взято из исходников AvalonEdit https://github.com/icsharpcode/AvalonEdit
Описание встроенных команд в AvalonEdit - Команда DeleteLine https://github.com/icsharpcode/AvalonEdit/blob/106b31efe17a4992e1c02ee5c8650bc86591aeb7/ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs#L499
// Перемещение текста на одну строчку вверх
static void MoveTextToLineUp(object target, ExecutedRoutedEventArgs e)
{
TextEditor textEditor = target as TextEditor;
TextArea textArea = (target as TextEditor)?.TextArea;// as TextArea;
// Если объект нулевой вернуться
if (textArea == null || textArea.Document == null)
return;
// индексы первой и последней строчки исходного выделенного текста
int firstLineIndex, lastLineIndex;
// Проверяем выделенный исходный текст
if (textArea.Selection.Length == 0)
{
// Если ни чего не выделено, индексы указывают на одну и ту же строчку
firstLineIndex = lastLineIndex = textArea.Caret.Line;
}
else
{
// Если выделен фрагмент текста, ищем начальную и конечную строчки
firstLineIndex = Math.Min(textArea.Selection.StartPosition.Line, textArea.Selection.EndPosition.Line);
lastLineIndex = Math.Max(textArea.Selection.StartPosition.Line, textArea.Selection.EndPosition.Line);
}
// Если выбрана первая строка - то и двигать уже не нужно - возвращаемся
if (firstLineIndex < 2) return;
//Номер предыдущей за исходными текстом
int prevlineNumber = firstLineIndex - 1;
DocumentLine PrevLine = textArea.Document.GetLineByNumber(prevlineNumber);
// Последняя строка исходного текста
DocumentLine endLine = textArea.Document.GetLineByNumber(lastLineIndex);
// Текст в предыдущей строчке перед выделенным текстом
string PrevText = textArea.Document.Text.Substring(PrevLine.Offset, PrevLine.TotalLength);
// Сначала вставляем за исходным текстом
textArea.Document.Insert(endLine.Offset + endLine.TotalLength, PrevText);
//Затем удаляем предыдущую строчку
textArea.Document.Remove(PrevLine.Offset, PrevLine.TotalLength);
//Передаем управление обратно
e.Handled = true;
}