知識マップ: WPFの高DPI対応 ── 「DPIに強いはず」なのにぼやける・にじむ原因と対処

記事「WPFの高DPI対応 ── 「DPIに強いはず」なのにぼやける・にじむ原因と対処」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

WPFはレイアウト単位がDIPで既定でSystem DPI Awareのため起動時の主モニターDPIには自動で追従するが、System Awareのままだと異なるDPIのモニターへ移した際にOSのDPI仮想化が働き画面全体がにじむ。これを根治するのがPer-Monitor DPI対応で、アプリケーションマニフェストへの宣言だけでウィンドウの再スケーリングがフレームワークにより自動化される。残る改修対象は、UseLayoutRoundingで防ぐサブピクセル配置のにじみ、ベクター資産や複数解像度の切り替えで防ぐビットマップのぼやけ、そしてWriteableBitmapのようなピクセルバッファを自前で扱うコードのOnDpiChangedへの追従に絞られる。WindowsFormsHostやWebBrowserコントロールのようにHWNDを持ち込む混在コンテンツは、Per-Monitor対応の上限を決める要素として別枠で扱う必要がある。

WPFの高DPI対応の知識マップWPFがDIPとSystem DPI Awareによって起動時のDPIには自動追従する一方、異なるDPIのモニター間ではOSのDPI仮想化がにじみを引き起こし、Per-Monitor DPI対応の宣言がそれを防ぐこと、UseLayoutRoundingやベクター資産がそれぞれサブピクセルのにじみとビットマップのぼやけを防ぐこと、WindowsFormsHostやWebBrowserなどHWNDを持つ混在コンテンツがPer-Monitor対応の上限になることを示す図。利用する実装を担う原因になり得る原因になり得る防止する前提とする前提とする原因になり得る利用する利用する前提とする原因になり得るの後継原因になり得る原因になり得る防止する軽減する前提とする前提とする原因になり得る軽減する軽減するより先に行うべき用いるのは非推奨WPFPer-Monitor DPI対応DIP(デバイス非依存単位)System DPI Awareモニター間移動時の全体のにじみDPI仮想化アプリケーションマニフェスト.NET FrameworkWindowsFormsHostホストしたコンテンツのスケーリング制限Windows FormsHWND(ウィンドウハンドル)Microsoft Edge WebView2WebBrowserコントロールビットマップ画像のぼやけベクター画像資産BitmapScalingModeOnDpiChanged(DPI変更への追従)ピクセルバッファを自前で扱うコードサブピクセル配置UseLayoutRoundingSnapsToDevicePixelsTextFormattingMode(Ideal/Display)

概念間の関係(全24件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

WPF
XAMLでUIを宣言的に記述する、Windows専用のデスクトップUIフレームワーク。ベクターベースの描画とデータバインディングを特徴とする。
Per-Monitor DPI対応
モニターごとに異なるDPIへ自分で追従することをOSへ宣言する認識モードで、WPFでは.NET Framework 4.6.2以降でフレームワークが再スケーリングを自動化する。
System DPI Aware
サインイン時の主モニターのDPIに合わせて描画が固定されるDPI認識モード。主モニター以外や、サインイン後にDPIが変わった場合はOSが拡大表示する。WPFは宣言なしでこの状態になる。
DPI仮想化
DPI対応を宣言していないアプリに対し、OSが「画面は96 DPIだ」と偽って描かせ、その結果をビットマップとして拡大表示する救済措置。レイアウトは崩れない代わりに全体がにじむ。
WindowsFormsHost
WPFアプリの中にWindows Formsコントロールを埋め込むための要素で、DIPと物理ピクセルの2座標系をホストが変換する。
HWND(ウィンドウハンドル)
Windowsがウィンドウ1枚ごとに割り当てる識別子で、WPFはトップレベルのウィンドウにだけこれを持ち、HWNDを持ち込む要素だけがWPFの描画の外側になる。
Microsoft Edge WebView2
Chromiumベースのランタイムを使ってWindowsアプリにWeb描画エンジンを埋め込む仕組み。WebBrowserコントロールの完全な差し替え部品ではない。
WebBrowserコントロール
WindowsアプリにIE系の描画エンジンを埋め込むための.NETのコントロール。IEの世界観を引きずる。
DIP(デバイス非依存単位)
1/96インチを1とするWPFのレイアウト単位で、XAMLに書くWidthやHeightの値はこの単位で扱われる。
ベクター画像資産
Path・Geometry・DrawingImageやアイコンフォントなど、どのDPIでもくっきり描画されるベクター形式の画像資産。
BitmapScalingMode
既定はLinearで、HighQuality(Fant)やNearestNeighborなど画像の補間拡大アルゴリズムを選べるWPFのプロパティ。
ピクセルバッファを自前で扱うコード
WriteableBitmapやRenderTargetBitmapなど、物理ピクセル数を自分で計算してピクセルバッファを作るコード。
UseLayoutRounding
レイアウトパスで非整数のピクセル値を丸める仕組みで、既定は無効、ルート要素に設定するとビジュアルツリー全体へ伝播する。
SnapsToDevicePixels
描画時にエッジをピクセル境界へスナップするWPFのプロパティで、既定はfalse、設定はサブツリーへ継承される。
TextFormattingMode(Ideal/Display)
フォント本来の理想メトリクスで配置するIdeal(既定)と、GDI互換メトリクスで配置するDisplayの2モードを持つWPFのテキスト整形設定。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。