Действительно ли возможно выбрать несколько частей текста в текстовом поле WPF? Например, для текстового поля, которое содержит строку THIS IS A TEST
, Я хочу смочь выделиться THIS
, затем держите Ctrl и выделение TEST
без отмены выбора THIS
.
Для визуальной подсказки о том, к чему я стремлюсь, см. эту статью о функции в Firefox.
Если бы по умолчанию нет никакого способа выполнить это, я хотел бы знать, существует ли какое-либо стороннее управление, реализованное в WPF, который делает.
Классы TextBox и RichTextBox в WPF напрямую не поддерживают мультиселекцию, но, как и в большинстве других частей WPF, очень легко настроить существующий RichTextBox для получения этой возможности.
Шаги таковы:
ObservableCollection
, которое будет содержать все выбранные диапазоны, кроме текущего TextSelectionOnPreviewMouseLeftButtonDown
: Если нажата клавиша Ctrl, объедините текущий TextSelection в свойство "AdditionalRanges" и очистите Selection, иначе очистите "AdditionalRanges". CollectionChanged
для "AdditionalRanges", который использует TextRange.ApplyPropertyValue()
, чтобы добавленные диапазоны в коллекции отображались подсвеченными, а удаленные - обычными. В вашей реализации я также рекомендую реализовать еще несколько свойств для удобства:
Все эти свойства достаточно тривиальны для реализации.
Последние замечания:
TextChanged
, чтобы знать, когда обновлять свойство "Text", и PropertyChangedCallback, чтобы знать, когда обновлять FlowDocumentстандартный WPF TextBox, к сожалению, не поддерживает такое поведение. Поэтому единственным способом, который я вижу для получения такой функциональности, будет реализация собственного элемента управления текстовым полем (возможно, на основе стандартного шаблона ControlTemplate текстового поля).
С уважением, Алекс