私は現在、WPFで強調表示可能なリッチテキストボックスコントロールに取り組んでいます。ユーザーは検索ボックスにテキストを入力でき、リッチテキストボックスは検索された単語の出現箇所を強調表示します。リッチテキストボックスにハイパーリンクが表示されるまで、すべて正常に機能します。次に例を示します。
blablabla stackoverflow.com
そして、私は用語を検索します:
st
それは赤い前景でテキスト(stackoverflowの "st")を正しく強調表示します。しかし、バックスペースを押しているとき(つまり、検索語が単一の「s」文字になるとき)、例外が発生します。
System.ArgumentException: 'NamedObject' parameter type is not valid for formatting property 'Foreground'.
Parameter name: value
これは、私のアルゴリズムが次のようになっているためです。
リッチテキストボックス内のテキストを強調表示します。強調表示されたすべてのTextRangeを辞書に追加します。キーは強調表示されたTextRangeであり、値はこのコードで取得したTextRangeの古いフォアグラウンドプロパティです。
textrange.GetPropertyValue(TextElement.ForegroundProperty)
ユーザーがフィルター文字列を変更するたびに、古い強調表示を削除し、手順1のように、リッチテキストボックスを新しいフィルター文字列で「再強調表示」します。
例外は、プロセスの「強調表示を削除する」部分から発生します。ハイライトを削除するために、ディクショナリを列挙し、TextRangeごとにForegroundPropertyを保存された値にリセットします。
foreach (var textRangeEntry in highlightedTexts) { textRangeEntry.Key.ApplyPropertyValue(TextElement.ForegroundProperty, textRangeEntry.Value); }
問題は、保存されたForegroundPropertyがDependencyProperty.UnsetValueになることがあり、例外が発生することです。
これは奇妙です。ForegroundPropertyはUnsetValueを「気に入らない」ように見えますが、たとえば、
ov
本文中
blablabla stackoverflow.com
そして、「v」を消去するときは、すべて問題ありません。
例外は、ハイパーリンクの先頭を強調表示している場合にのみ発生します。
それはWPFの奇妙なバグですか、それとも私は何か間違ったことをしますか?