WPF の RichTextBox でキャレットがあるパラグラフを強調表示する

入力補助の一環として、現在編集中の(つまりキャレットがある)パラグラフがわかりやすいように強調表示する方法を考えた。

まずは XAML 定義。ここで大事なのは RichTextBox の SelectionChanged イベントだ。名前からすると、テキストを選択状態にした時に発生しそうなイベントなのだが、実はキャレット移動時に発生する。この SelectionChanged イベントのハンドラで強調表示の切り替えを実装する。なお、Style と Resource の定義は、それぞれデフォルトの文字スタイルと、強調表示用の文字スタイルの定義である。

<RichTextBox Name="richTextBox" SelectionChanged="Highlight">
<RichTextBox.Style>
<Style TargetType="RichTextBox">
<Setter Property="FontFamily" Value="MS UI Gothic"/>
<Setter Property="FontSize" Value="12"/>
</Style>
</RichTextBox.Style>
<RichTextBox.Resources>
<Style x:Key="selectedBlock" TargetType="Block">
<Setter Property="Background" Value="LightBlue"/>
<Setter Property="FontSize" Value="16"/>
</Style>
</RichTextBox.Resources>
</RichTextBox>


次は Hightlight メソッド(SelectionChanged イベントハンドラ)。RichTextBox 内の各ブロックを調べて、キャレットがあるブロックを見つけたら強調表示スタイルを適用、それ以外のブロックはスタイルをクリアしている(スタイルをクリアしたら暗黙的に RichTextBox のスタイルが適用される)。スタイルのクリア処理は、別のパラグラフへ移った時に、前のパラグラフの強調表示を解除するため。



private void Highlight(object sender, RoutedEventArgs e)
{
Paragraph paragraph = this.richTextBox.CaretPosition.Paragraph;
foreach (Block block in this.richTextBox.Document.Blocks)
{
block.Style = (block == paragraph) ? (Style)this.richTextBox.TryFindResource("selectedBlock") : null;
}
}


実行してみるとこんな感じになる。



capture

Comments

Popular posts from this blog

TFS: 別PCでのチェックアウトを取り消す

WPF の RichTextBox に文字列を設定する&取り出す

WPFアプリにアニメーションGIFを表示させる