WPF において、TextBlock に表示する文字列に全角スペースが含まれていると、表示状態によってランタイム エラーが発生する

現象
次のような状況で問題が発生します。
  • Windows Presentation Foundation (WPF) アプリケーションで TextBlock を使用して文字列を表示します。
  • 表示する文字列の行末には、全角スペース (Unicode \u3000) を含んでいます。
  • JIS2004 に対応していない Windows XP もしくは Windows Server 2003 上でアプリケーションを実行します。
ウィンドウ操作などにより、この全角スペースが含まれる TextBlock 内で文字列が折り返される状態になったとき、.NET Framework のランタイム エラーが発生します。
原因
WPF 内には、表示する文字列の表示幅を求めるために、次の 2 種類の方法が用意されています。
  1. 単純に文字幅を加算して文字列の表示幅を計算する方法。
  2. 文字ごとの長さだけではなく、文字と文字の関係を考慮し、TrueType フォントの属性値などを利用しながら表示幅を計算する方法。
この 2 種類の方法には処理速度に差があるため、WPF では以下の条件を基に処理を切り替えています。
  1. B. の方法を用いなくても正確な数値が得られるフォントであれば、A. を使用します。それ以外の場合には、B. のみを使用します。
  2. A. により表示幅を算出し、テキストを折り返す必要があると判断した場合、B. の処理に切り替えて表示幅を計算し直し、折り返す位置を求めます。
A. の方法を用いるかどうかは、TrueType フォントの表意文字に関するフラグの状態を見て切り替えています。Windows XP や Windows Server 2003 に含まれる MS ゴシックや MS 明朝などのフォントは、このフラグがオンに設定されておらず、最初に必ず A. の方法を選択して処理が始まり、折り返しが必要な場合には B. に切り替えて処理するという動作になります。しかしながら、A. と B. の方法には、行末にある Unicode \u3000 の扱いに違いがあり、算出結果に差が生じます。この差がその後の折り返し処理の継続を阻害するため、ランタイム エラーが発生します。
回避策
以下の 2 つの方法のうちどちらかにより、この現象を回避することが可能です。
  • JIS2004 対応フォントを使用する
  • 文字列から全角スペースを除く
Windows XP および Windows Server 2003 用の JIS2004 対応フォントは、以下のリンクから入手することが可能です。

927489 Windows XP および Windows Server 2003 で JIS2004 対応フォントを使用する方法
状況
マイクロソフトでは、特定の問題に対応するソフトウェア更新プログラムを定期的にリリースしています。この問題を解決するソフトウェア更新プログラムがリリースされた場合、この資料は更新されます。
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:2589677 - 最終更新日: 10/18/2016 08:36:00 - リビジョン: 4.0

Microsoft .NET Framework 3.0 Service Pack 2, Microsoft .NET Framework 3.5 Service Pack 1

  • kbbug kbexpertiseinter KB2589677
フィードバック