Как я могу выбрать несколько сегментов текста в текстовом поле WPF?

Действительно ли возможно выбрать несколько частей текста в текстовом поле WPF? Например, для текстового поля, которое содержит строку THIS IS A TEST, Я хочу смочь выделиться THIS, затем держите Ctrl и выделение TEST без отмены выбора THIS.

Для визуальной подсказки о том, к чему я стремлюсь, см. эту статью о функции в Firefox.

Если бы по умолчанию нет никакого способа выполнить это, я хотел бы знать, существует ли какое-либо стороннее управление, реализованное в WPF, который делает.

9
задан luvieere 18 May 2010 в 03:43
поделиться

2 ответа

Классы TextBox и RichTextBox в WPF напрямую не поддерживают мультиселекцию, но, как и в большинстве других частей WPF, очень легко настроить существующий RichTextBox для получения этой возможности.

Шаги таковы:

  • Создайте класс, производный от RichTextBox
  • Добавьте свойство "AdditionalRanges" типа ObservableCollection, которое будет содержать все выбранные диапазоны, кроме текущего TextSelection
  • Переопределите OnPreviewMouseLeftButtonDown: Если нажата клавиша Ctrl, объедините текущий TextSelection в свойство "AdditionalRanges" и очистите Selection, иначе очистите "AdditionalRanges".
  • В конструкторе добавьте обработчик CollectionChanged для "AdditionalRanges", который использует TextRange.ApplyPropertyValue(), чтобы добавленные диапазоны в коллекции отображались подсвеченными, а удаленные - обычными.

В вашей реализации я также рекомендую реализовать еще несколько свойств для удобства:

  • Свойство "AllRanges", которое объединяет TextSelection с AdditionalRanges
  • Связываемое свойство "Text"
  • Связываемое свойство "SelectedText"

Все эти свойства достаточно тривиальны для реализации.

Последние замечания:

  • При обновлении AdditionalRanges или вычислении AllRanges, если TextSelection перекрывает существующий AdditionalRange, замените его на объединенный диапазон, иначе добавьте TextSelection в список.
  • Вы можете добавить обработчик TextChanged, чтобы знать, когда обновлять свойство "Text", и PropertyChangedCallback, чтобы знать, когда обновлять FlowDocument
14
ответ дан 4 December 2019 в 13:00
поделиться

стандартный WPF TextBox, к сожалению, не поддерживает такое поведение. Поэтому единственным способом, который я вижу для получения такой функциональности, будет реализация собственного элемента управления текстовым полем (возможно, на основе стандартного шаблона ControlTemplate текстового поля).

С уважением, Алекс

2
ответ дан 4 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: