.NET Framework 4.6.2 を実行する Office COM アドインの高 DPI サポートを完成させようとしています。Office で DPI スケーリングを処理するために Microsoft が概説した原則に従っています。Office アドインに使用できる唯一の方法は、スレッドごとに DPI 認識を設定することです。これは、一般的なマニフェストおよびスタートアップ ソリューションが利用できないためです。
私がスケーリングしているフォームは、要素ホストで WPF UserControl をホストするフォーム ウィンドウです。これは実用的な解決策として提案されたもので、 Add-In Express によって提供されるデモ コードでうまく使用されていることがわかりました。
Microsoft の推奨に従って、スレッド DPI コンテキストをモニターごとに設定した後、フォームを開いています。これを使用して、上記の Add-In Express によって提供されるデモ コードを使用して、aLayoutTransform
を UserControl に適用し、すべての要素を正しいサイズにスケーリングします。
private void ApplyScale(int dpi)
{
var source = (HwndSource) PresentationSource.FromVisual(this);
if (source is null) return;
var wpfDpi = 96 * source.CompositionTarget.TransformToDevice.M11;
var scaleFactor = dpi / wpfDpi;
var scaleTransform = Math.Abs(scaleFactor - 1.0) < 0.001 ? null : new ScaleTransform(scaleFactor, scaleFactor);
this.SetValue(LayoutTransformProperty, scaleTransform);
}
これは期待どおりに機能しており、ウィンドウは DPI が異なる各モニターで正常にスケーリングされ、ウィンドウとコンテンツの両方のサイズが正しいサイズに拡大されています。
スケーリングされたコンテンツを操作しようとすると、問題が発生します。100% スケーリングを超えるモニターでは、ウィンドウの右端と下端の一部が正しく操作できません。フォームの右下隅に [保存] ボタンと [キャンセル] ボタンがあり、それらの上にマウスを置くと、ホバー イベントがちらつきますが、通常はクリックできません。これは、フォームに含まれる ListView にも当てはまります。
スレッドが確実にモニターごとの認識に設定されており、視覚的なスケーリングが完全に機能していることを確認できます。要素が重なっておらず、クリックできない領域のサイズがスケールとともに大きくなります。
これをデバッグしてから2日が経ち、考えられることはすべて試しました。何が原因でしょうか?