WPF テキスト ボックス (RichTextBox ではない) があり、このテキスト ボックス内で検索結果を (Web ブラウザーのように) 強調表示したい
たとえば、「abc」を検索すると、「abc」のすべての出現箇所が強調表示されます (たとえば、赤い背景またはフォントで)。
RichTextBox コントロールを使用せずにこれが可能かどうかを知りたいですか?
WPF テキスト ボックス (RichTextBox ではない) があり、このテキスト ボックス内で検索結果を (Web ブラウザーのように) 強調表示したい
たとえば、「abc」を検索すると、「abc」のすべての出現箇所が強調表示されます (たとえば、赤い背景またはフォントで)。
RichTextBox コントロールを使用せずにこれが可能かどうかを知りたいですか?
可能ですが、 a を使用する方がはるかに簡単なRichTextBox
ので、代わりに a を使用することを検討してください。さらに、フォントサイズを変更することはできず、色 (背景および/または前景) と効果のみを変更できます。
TextBox
render メソッドをオーバーライドするため、最初に独自のクラスを派生させる必要があります。ここでメソッドをオーバーライドしますOnRender()
。ここでは、メソッドを使用しDrawingContext.DrawText()
てテキストを描画します (すべてをFormattedText
オブジェクト内に配置します。主に、そのプロパティを調整して、標準と同様にする必要がありますTextBox
)。
今あなたが持っているのは、テキストを描画するプレーンTextBox
です。この開始点から、次のことを選択できます。
TextBox
テキスト描画を完全にオーバーライドします:TextBox.Foreground
プロパティを に設定しますBrushes.Transparent
。ユーザーは「実際の」テキストを操作しますが、描画したテキストが表示されます。これを機能させるには、元の でテキストがどのように描画されるかを正確に模倣する必要があることに注意してください (たとえば、フォント サイズを変更すると、それらは整列されなくなります) TextBox
。
ベーステキストの描画を維持するために必要なハイライト機能を追加しますTextBox
。ハイライトしたいテキストがどこにあるかを計算し、適切な背景を描画します。
参考文献
この (簡略化された!) アルゴリズムはCodeBox2TextBox
から来ており、もともとは、いくつかの単純なエディターのような機能を拡張するために設計されました。
このための組み込み機能はありません。また、TextBox は、テキスト全体に対して 1 つの fontstyle のみをサポートします。
テキストを読み取り専用にする必要がある場合は、フローまたは固定ドキュメントを使用して、Run Elements でテキストをフォーマットできます。