0

我正在尝试最终确定对运行 .NET Framework 4.6.2 的 Office COM 加载项的高 DPI 支持。我遵循 Microsoft 概述的在 Office 中处理 DPI 缩放的原则。可用于 Office 加载项的唯一方法是设置每个线程的 DPI 感知,因为典型的清单和启动解决方案不可用。

我正在缩放的​​表单是在元素主机中托管 WPF 用户控件的表单窗口。这是作为一个可行的解决方案提出的,我观察到它在Add-In Express 提供的演示代码中成功使用。

按照 Microsoft 的建议,我在将线程 DPI 上下文设置为 Per Monitor 后打开我的表单。使用它,上面由 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 也是如此。

我可以确认线程绝对设置为 Per Monitor 感知,并且视觉缩放工作正常。没有元素重叠,并且无法点击的区域的大小随着比例的增加而增加。

我已经调试了两天,并尝试了我能想到的一切。这可能是什么原因造成的?

4

0 回答 0