【问题标题】:Mixed WPF and winforms project DPI awareness混合 WPF 和 winforms 项目 DPI 意识
【发布时间】:2016-01-20 13:01:25
【问题描述】:

我有一个同时使用 winforms 和 WPF 的 C# 程序,我正在努力让它在高 DPI 环境中工作。 目前,如果我从解决方案中删除所有 WPF 项目并运行它,它会很好地缩放,但是一旦我重新添加任何 wpf(功能所必需),缩放就会失败并且 UI 变得不可用。

这似乎与之前的 SO 问题完全相同:DPI Scaling in .Net 3.5 in Mixed WinForms and WPF ApplicationProblems getting WinForms to scale correctly with DPI

我按照关于这些问题的建议并尝试添加清单文件和提供的 dpi 感知代码。

我还将项目升级到 .net framework 4.6.1(从 4.0)并包含 app.config 设置:<add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />

这确实影响了程序的主外壳(所以不是在所有控件都被压扁的小窗口中加载,而是主程序窗口打开最大化并显示正常)但是,当我从主窗口,缩放失败。

当我输入任何 WPF 子表单或插件,或返回主屏幕时,这些都会正确呈现。只有 winforms 功能无法正确扩展。

有没有人知道如何让混合 winforms/WPF 项目在高 DPI 下正确缩放?

提前致谢

【问题讨论】:

  • 如果您认为这是更好的方法,好的。我发布了一个新问题,因为我认为我有一个不同的问题,因为他们的修复对我不起作用。

标签: c# wpf winforms .net-4.6 highdpi


【解决方案1】:

当 WPF 加载到项目中时,它会将进程提升为系统 DPI 感知。为了解决这个问题,首先: 1) 在您的条目程序集中的命名空间声明上方设置 [assembly: DisableDpiAwareness] 属性 2)你可以在你的项目中添加一个app.manifest文件并添加以下内容:

 <asmv3:windowsSettings
 xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
       <dpiAware>true/PM</dpiAware> 
 </asmv3:windowsSettings>

这应该以正确的目标 DPI 呈现您的 WinForms 和 WPF 内容。 (但是,如果您有一个具有不同 DPI 的多显示器设置,这将无法扩展)。

【讨论】:

  • 这是引用的问题“stackoverflow.com/questions/19552299/…”的答案,我说它对我不起作用。
  • @AnyaHope 注意到不同之处。我说过你需要将 设置为 true/PM not true。 true/PM 表示 Per Monitor Aware,而 true 表示 System DPI 感知。
  • 对不起,你是对的。我没有注意到。不幸的是,当时我正在尝试 配置设置,我确实尝试使用所有不同的可能值,但遗憾的是没有一个起作用。
  • @AnyaHope 我很惊讶它不起作用。实现此目的的另一种方法是在您的条目程序集中设置 [assembly: DisableDpiAwareness] 属性。
  • 非常感谢您为我尝试。我会试试这个。我认为我很难让它工作的原因是因为我正在处理的应用程序的性质。这是一个非常复杂的解决方案,包含数十个“插件”项目。我确定我一定错过了什么。
【解决方案2】:

我的同事终于解决了这个问题。由于任何配置设置等都不适用于该项目,因此我们尝试删除 winforms shell 并将其替换为 WPF shell。在 WPF 中重写主 shell 项目后,所有“插件”都会以正确的 DPI 缩放显示。

考虑到它涉及重写现有代码,这不是我所知道的最佳解决方案,但这是为我们解决问题的唯一方法。

【讨论】:

    【解决方案3】:

    如果由于您是 WinForms 应用而不是 WPF 应用而没有清单文件,则必须通过 AssemblyInfo.cs 进行更改。因为它的方向相反,所以您必须禁用 DPI 感知才能使世界同步,而不是像上面的 WPF 方法那样启用它。

    在 AssemblyInfo.cs 中,添加以下行。

    [assembly: System.Windows.Media.DisableDpiAwareness]
    

    我的问题被标记为与此重复,但不是真正的重复,因为我有一个使用 WPF 组件的 WinForms 应用程序,而不是相反。我正在为像我这样因错误原因被引导到这里的人添加这个答案。

    【讨论】:

    • 我的项目一开始就是这样。 Winforms 基础,WPF 组件,所以我真的很高兴这对于处于相同情况的其他人来说。感谢发帖
    【解决方案4】:

    非常感谢@rohit21agrawal 的回答!

    我有一个非常相似的复杂 Win Forms 解决方案,每当我在 WeifenLuo 的 DockPanelSuite 中打开一个停靠的 Form 时,Form 都会调整大小并弄乱整个 GUI。

    现在,经过几年尝试不同的方法(但都没有奏效),你救了我的命!

    除了您对其他所有想知道如何完成您的解决方案的开发人员的回答之外:

    1. a)(我的项目面向 .NET Framework 4.7.2)
    2. b)(我所有的表单都设置为 AutoScaleMode = Font)
    3. 在您的 WinForms 项目中,添加 对 WindowsBase 的引用(应该是程序集列表中的倒数第三个条目)
    4. 将“[assembly: System.Windows.Media.DisableDpiAwareness]”添加到您的 AssemblyInfo.cs
    5. 添加“
    <application xmlns="urn:schemas-microsoft-com:asm.v3">
      <windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
        <dpiAware>true/PM</dpiAware>
      </windowsSettings>
    </application>
    

    " 到您的 app.manifest 文件的父级 "&lt;assembly&gt;…&lt;/assembly&gt;" 部分

    就我而言,这就像一个魅力:-) 最终,我能够在不同的显示器之间移动表单(一个 175% 的 4K 和另一个 125% 字体比例的全高清),它会立即重绘/重新渲染所有控件!

    再次感谢您! 线

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2011-09-22
      相关资源
      最近更新 更多