2010-05-13 21 views
9

È possibile selezionare più parti di testo all'interno di una casella di testo WPF? Ad esempio, per una casella di testo che contiene la stringa THIS IS A TEST, desidero essere in grado di evidenziare THIS, quindi tenere premuto Ctrl e evidenziare TEST senza deselezionare THIS.Come posso selezionare più segmenti di testo in una casella di testo WPF?

Per un indizio visivo su cosa sto mirando, vedere l'articolo this sulla funzionalità di Firefox.

Se per impostazione predefinita non è possibile eseguire questa operazione, vorrei sapere se esiste un controllo di terze parti implementato in WPF.

risposta

13

classi TextBox e RichTextBox di WPF non supportano direttamente multipla, ma come con la maggior parte delle parti di WPF è estremamente facile da personalizzare la sua RichTextBox esistente per ottenere questa capacità.

I passi sono:

  • creare una classe derivante dalla RichTextBox
  • Aggiungere una proprietà "AdditionalRanges" di tipo ObservableCollection<TextRange> che conterrà tutti i campi selezionati, tranne il TextSelection corrente
  • Override OnPreviewMouseLeftButtonDown: Se Ctrl viene premuto, combina l'attuale TextSelection nella proprietà "AdditionalRanges" e deseleziona Selection, altrimenti deseleziona "AdditionalRanges".
  • Nel costruttore, aggiungere un gestore CollectionChanged a "AdditionalRanges" che utilizza TextRange.ApplyPropertyValue() per fare in modo che gli intervalli aggiunti nella raccolta appaiano in modo normale e gli intervalli rimossi vengano visualizzati normalmente.

Nell'implementazione Mi consiglia inoltre di implementare un paio di altre proprietà in convenienza:

  • Un "AllRanges" proprietà che combina la TextSelection con AdditionalRanges
  • A associabile proprietà "Testo"
  • Proprietà "SelectedText" associabile

Questi sono tutti abbastanza banali da implementare.

Note finali:

  • Durante l'aggiornamento AdditionalRanges o AllRanges calcolo, se il TextSelection sovrappone un AdditionalRange esistente, sostituirla con una gamma combinata altrimenti aggiungere il TextSelection alla lista.
  • È possibile aggiungere un gestore TextChanged sapere quando per aggiornare la proprietà "Testo", e un PropertyChangedCallback sapere quando aggiornare il FlowDocument
2

lo standard WPF TextBox non supporta tale comportamento, sfortunatamente. Quindi l'unico modo che vedo per ottenere quella funzionalità sarebbe l'implementazione del proprio controllo casella di testo (magari basato sulla casella di testo standard ControlTemplate).

Cheers, Alex

Problemi correlati