2010-05-13 8 views
9

¿Es posible seleccionar varias partes de texto dentro de un cuadro de texto WPF? Por ejemplo, para un cuadro de texto que contiene la cadena THIS IS A TEST, deseo poder resaltar THIS, luego mantenga presionada la tecla Ctrl y resalte TEST sin deseleccionar THIS.¿Cómo puedo seleccionar varios segmentos de texto en un cuadro de texto WPF?

Para obtener una pista visual sobre a qué me refiero, consulte el artículo this sobre la función en Firefox.

Si de forma predeterminada no hay forma de lograr esto, me gustaría saber si hay algún control de terceros implementado en WPF que lo haga.

Respuesta

13

clases de texto y RichTextBox de WPF no apoyan directamente selección múltiple, pero como ocurre con la mayor parte de WPF Es muy fácil de personalizar su RichTextBox existente para conseguir esta capacidad.

Los pasos son:

  • Crear una deriva clase de RichTextBox
  • Añadir un "AdditionalRanges" propiedad de tipo ObservableCollection<TextRange> que contendrá todos los rangos seleccionados, excepto el TextSelection actual
  • Anulación OnPreviewMouseLeftButtonDown: Si Ctrl se presiona, combine la actual TextSelection en su propiedad "AdditionalRanges" y borre Selection, de lo contrario borre "AdditionalRanges".
  • En el constructor, agregue un controlador CollectionChanged a "AdditionalRanges" que usa TextRange.ApplyPropertyValue() para hacer que los rangos agregados en la colección aparezcan resaltados y los rangos eliminados aparezcan normalmente.

En su aplicación también recomiendo a implementar unos pocos más propiedades para mayor comodidad:

"AllRanges"
  • Una propiedad que combina la TextSelection con AdditionalRanges
  • un "texto" enlazable la propiedad
  • Una propiedad "SelectedText" enlazable

Todas estas son muy triviales de implementar.

notas finales:

  • Al actualizar AdditionalRanges o AllRanges de cálculo, si el TextSelection superpone una AdditionalRange existente, sustituirla por una gama combinada de lo contrario añadir el TextSelection a la lista.
  • Usted puede agregar un controlador TextChanged saber cuándo hay que actualizar la propiedad "Texto", y una PropertyChangedCallback saber cuándo hay que actualizar el FlowDocument
2

el WPF TextBox estándar no es compatible con este tipo de comportamiento, lamentablemente. Así que la única forma en que veo para obtener esa funcionalidad sería implementar su propio control de cuadro de texto (tal vez basado en el cuadro de texto estándar ControlTemplate).

Saludos, Alex

Cuestiones relacionadas