WPF TextBoxでは、文字列内の特定の長さを超える文字を赤くできますか?
-
05-07-2019 - |
質問
TextBox
コントロールを使用しているので、入力した文字が多すぎることをユーザーに示すために、特定の文字数の後に文字を赤くしたい。ユーザーが「本当に重要な考え」と入力した可能性があるため、切り捨てたくありません。そして、私が切り捨てた場合、彼らはそれを失うでしょう。入力が無効であるときに通知する基礎となるビジネスモデルの検証があり、無効を示すために TextBox
をスタイルします。
テキストもスタイル
したい。 TextBox
を使用してこれを実行できますか、または RichTextBox
に移動する必要がありますか?私の基本的な値は単なる文字列です。
解決
ストックのWPF検証メカニズム- ValidationRules
を使用していると仮定します。その場合、 Validation.HasError == true
で Trigger
を定義し、必要に応じて TextBox
プロパティを設定する必要があります。たとえば、次の例では、無効なテキストは赤で強調表示されます。
<TextBox>
<TextBox.Text>
<Binding ...>
<Binding.ValidationRules>
...
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
<TextBox.Style>
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="Foreground" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
他のヒント
これは一種のクレイジーな回答であり、まだ試していませんが、機能する場合は、リッチテキストボックスの代わりにテキストボックスを使用し続けることができます。
グラデーションブラシを使用してテキストをペイントした場合(または、テキストでない場合は、テキストボックスの背景、それが受け入れられる場合)。
グラデーションが作成され、入力が長くなりすぎるまで白くなり、その後赤くなります。もちろん、テキストが長くなりすぎるまで、ブラシはすべて白になります。
これには、グラデーションの定義を正しくするためのテキスト測定が含まれます(プロポーショナルフォントは、入力された文字に応じて有効な領域のサイズが異なるため)。 入力した各文字でブラシを計算して割り当てる必要があります。