WPF アプリケーションの画面表示が不正になる件について

こんにちは、Visual Studio サポート チームです。

今回は、WPF アプリケーションでの画面が正しく表示されない問題の切り分け方についてご紹介します。

WPF アプリケーションでは、画面が真っ白になる等、不正な表示になることが稀にあるというお問い合わせをいただくことがあります。
そのような問題は、現象を再現させるための手順が定まっていなかったり、特定の PC でしか問題を確認できなかったりすることがあります。
そのため、まずは問題が、ハードウェア (ビデオ ドライバー) にあるのか、ソフトウェアにあるのかの切り分けを行います。

WPF アプリケーションは、ウィンドウやコントロールの描画を行う際に、既定では、グラフィックス ハードウェアの機能を利用します。
グラフィックス ハードウェアを利用することによって、描画のパフォーマンスの向上が期待できます。
しかしながら、この機能は、ハードウェアに依存するため、描画が正しく行われない等の問題を引き起こす場合が稀にあります。
そのような場合には、グラフィックス ハードウェアの機能を無効にすることで問題を回避できることがあります。

グラフィックス ハードウェアの機能を無効にする手順は、以下となります。

 

  1. [スタート] - [ファイル名を指定して実行] に regedit と入力し、[OK] をクリックします。 
  2. レジストリ エディターが開きますので、左ペインから以下のパスを作成します。
        HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics
  3. 上記パス上で右クリックし、[新規] から [DWORD 値] を選択し、以下の値を作成します。
        値の名前: DisableHWAcceleration
    値の種類: REG_DWORD
    値のデータ: 1
  4. アプリケーションを再起動します。

 

このレジストリの情報は以下の技術情報に公開されていますので、さらに詳細を知りたい場合はご確認ください。

 

  グラフィックス レンダリングのレジストリ設定
  <https://msdn.microsoft.com/ja-jp/library/aa970912.aspx>

上記の設定は、WPF アプリケーション全体に適用される設定となりますが、特定のアプリケーション、または、ウィンドウのみを対象とすることも可能です。
例えば、レジストリを設定して問題が回避できることが分かったが、問題が発生するのは特定のプロセス(またはウインドウ)だけなので、それだけ変更したいといった場合です。
その場合、それぞれ ProcessRenderMode プロパティ、HwndTarget.RenderMode プロパティが用意されています。
アプリケーション側の修正が必要ですが、これらのプロパティを SoftwareOnly に変更するとことで、特定のプロセス(またはウインドウ)だけを対象とすることができます。

 

  RenderOptions.ProcessRenderMode プロパティ
<https://msdn.microsoft.com/ja-jp/library/system.windows.media.renderoptions.processrendermode>

  HwndTarget.RenderMode プロパティ
<https://msdn.microsoft.com/ja-jp/library/system.windows.interop.hwndtarget.rendermode>