2010-05-13 130 views
9

是否可以在WPF文本框中選擇多個文本部分?例如,對於包含字符串THIS IS A TEST一個文本框,我希望能夠以突出THIS,然後按住Ctrl鍵並突出TEST沒有取消選擇THIS如何在WPF文本框中選擇多個文本片段?

有關是我的目標在視覺線索,請參閱this文章瞭解Firefox的功能。

如果在默認情況下是沒有辦法做到這一點,我想知道是否有任何WPF,做實施的第三方控制。

回答

13

WPF的TextBox和RichTextBox的類不直接支持多項選擇,但與WPF的大部分地區這是非常容易定製其現有的RichTextBox來獲得這種能力。

的步驟是:

  • 從RichTextBox的
  • 創建類導出添加ObservableCollection<TextRange>類型的「AdditionalRanges」屬性,該屬性將包含除了當前TextSelection所有選定範圍
  • 覆蓋OnPreviewMouseLeftButtonDown:如果Ctrl鍵按下時,將當前TextSelection合併到您的「AdditionalRanges」屬性中並清除選擇,否則清除「AdditionalRanges」。
  • 在構造函數中,添加一個CollectionChanged處理程序使用TextRange.ApplyPropertyValue()使集合中添加的範圍內出現加亮後並去除範圍通常出現「AdditionalRanges」。

在您的實現我還建議你實現爲了方便多了一些屬性:

  • 的「AllRanges」屬性,它結合了AdditionalRanges的TextSelection
  • 可綁定的「Te​​xt」屬性
  • 一個可綁定的「SelectedText」屬性

這些都是相當微不足道的實現。

最後說明:

  • 當更新AdditionalRanges或計算AllRanges,如果TextSelection重疊的現有AdditionalRange,具有組合的範圍更換否則TextSelection添加到列表中。
  • 您可以添加TextChanged處理器知道什麼時候更新了「文本」屬性,以及PropertyChangedCallback知道什麼時候更新的FlowDocument
2

不幸的是標準的WPF TextBox不支持這種行爲。 所以我看到獲得該功能的唯一方法是實現自己的文本框控件(可能基於標準文本框ControlTemplate)。

乾杯,亞歷克斯