9

WPFテキストボックス内でテキストの複数の部分を選択することは可能ですか? たとえば、文字列 を含むテキストボックスの場合、を強調表示してから、 Ctrl を押したまま を選択解除せずTHIS IS A TESTに強調表示できるようにしたいと考えています。THISTESTTHIS

私が何を目指しているかについての視覚的な手がかりについては、Firefox の機能に関するこの記事を参照してください。

デフォルトでこれを達成する方法がない場合は、WPF に実装されているサードパーティ コントロールがあるかどうかを知りたいです。

4

2 に答える 2

15

WPF の TextBox クラスと RichTextBox クラスは複数選択を直接サポートしていませんが、WPF のほとんどの部分と同様に、既存の RichTextBox をカスタマイズしてこの機能を実現するのは非常に簡単です。

手順は次のとおりです。

  • RichTextBox から派生するクラスを作成する
  • ObservableCollection<TextRange>現在の TextSelection を除くすべての選択範囲を含むタイプの「AdditionalRanges」プロパティを追加します
  • Override OnPreviewMouseLeftButtonDown: Ctrl が押された場合、現在の TextSelection を "AdditionalRanges" プロパティに結合し、Selection をクリアします。それ以外の場合は、"AdditionalRanges" をクリアします。
  • コンストラクターで、コレクションに追加された範囲を強調表示し、削除された範囲を通常どおりに表示するためにCollectionChanged使用する "AdditionalRanges" にハンドラーを追加します。TextRange.ApplyPropertyValue()

実装では、利便性のためにさらにいくつかのプロパティを実装することをお勧めします。

  • TextSelection と AdditionalRanges を組み合わせた「AllRanges」プロパティ
  • バインド可能な「テキスト」プロパティ
  • バインド可能な「SelectedText」プロパティ

これらはすべて、実装するのが非常に簡単です。

最終的な注意事項:

  • AdditionalRanges を更新するとき、または AllRanges を計算するときに、TextSelection が既存の AdditionalRange と重複する場合は、それを組み合わせた範囲に置き換えます。それ以外の場合は、TextSelection をリストに追加します。
  • TextChanged「Text」プロパティをいつ更新するかを知るためのハンドラーと、FlowDocument をいつ更新するかを知るための PropertyChangedCallback を追加できます。
于 2010-05-17T23:32:02.690 に答える
2

残念ながら、標準の WPF TextBox はそのような動作をサポートしていません。したがって、その機能を実現する唯一の方法は、独自のテキスト ボックス コントロールを実装することです (標準のテキスト ボックス ControlTemplate に基づいている可能性があります)。

乾杯、アレックス

于 2010-05-17T13:50:34.650 に答える