RichTextBox 上の選択範囲に、TextSelection.ApplyPropertyValue() で FontStyle を適用した時の現象について

こんにちは、Platform SDK (Windows SDK) サポートチームです。

今回は、WPF の RichTextBox コントロール上の現在の選択範囲に対し、TextSelection.ApplyPropertyValue() で FontStyle を適用して修飾した場合について、二つの現象をご案内します。

 

  • 現象 1.
    RichTextBox.Selection プロパティに FontStyles.Italic スタイルを適用しても、RichTextBox 上では Italic スタイルで描画されません。
  • 現象 2.
    RichTextBox 内の文字列の最後尾にカーソルが存在する状態で、RichTextBox.Selection プロパティに FontStyles.Bold スタイルを適用した後、そのまま続けて全角文字を追記すると、追記した全角文字に Bold スタイルが適用されず、Bold スタイルで描画もされません。

 

以下に、現象 1. と 2. についてそれぞれ原因と対処方法をご案内します。

 

現象 1. について

 

原因

現象 1. は、Windows 7 SP1 および Windows 8.1 の WPF における RichTextBox 固有の不具合が原因で発生します。
このため、Windows 10 では発生しません。

現象 1. の不具合が発生した時も、ApplyPropertyValue() 呼び出しによって Italic スタイルそのものは正しく適用されています。
しかしながら、WPF 内部で RichTextBox 上にフォントをレンダリングする際に Italic 体のフォントを利用することができず、結果的に RichTextBox 上での描画結果が変化していない (= Italic スタイルで描画されない) 不具合が発生します。
レンダリングに失敗するフォントとスタイルのパターンは多岐に渡ることが確認されており、現在までにメイリオ フォントと Italic スタイル、そして Arial フォントと Italic、Bold、Underline スタイルのパターンで現象が確認されています。

対処方法

適用したスタイルに該当するフォントが利用できるように、アプリケーションから RichTextBox 内部のレンダリング処理を変更する方法はありません。
また、この不具合を修正する Windows 7 SP1 および Windows 8.1 用の修正プログラムは公開されておりません。
ご不便をおかけいたしますが、以下のいずれかの方法をご検討ください。

  • Windows 10 を使用する
  • WPF の RichTextBox の代わりに、Windows フォームの RichTextBox や、Win32 の RichText または MFC の CRichEditCtrl を使用する

 

現象 2. について

 

原因

現象 2. は、WPF の RichTextBox における仕様上の制限事項により、全角文字を追記した場合にのみ発生します。
また、Windows 7 SP1、Windows 8.1 および Windows 10 のいずれの OS でも発生します。

Windows フォームの RichTextBox や Win32 の RichEdit コントロール、そして MFC の CRichEditCtrl では、文字列の最後尾にカーソルが存在する状態で任意のスタイルを適用した後も、追記した文字に対してそのスタイルが続けて適用される仕様となっています。
これに対し WPF の RichTextBox は、WPF 独自の仕様に基づき開発されているため、スタイル情報の管理・制御の仕組みが Windows フォーム、Win32 そして MFC とは異なります。
WPF の RichTextBox の場合は、文字列の最後尾にカーソルが存在する状態で任意のスタイルを適用した後、そのまま追記した全角文字に対してはそのスタイルを適用しない仕様となります。

対処方法

追記した全角文字に対してもスタイルが適用されるように、アプリケーションから RichTextBox 内部のスタイル情報の管理・制御の仕組みを変更する方法はありません。
また、この動作を変更することが可能なシステム設定や、WPF のメソッド・プロパティも提供されておりません。
ご不便をおかけいたしますが、WPF の RichTextBox の代わりに、Windows フォームの RichTextBox や、Win32 の RichText または MFC の CRichEditCtrl のご利用をご検討ください。