繁体   English   中英

混合 WPF 和 winform 项目 DPI 意识

[英]Mixed WPF and winforms project DPI awareness

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

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

我遵循了有关这些问题的建议,并尝试添加清单文件和提供的 dpi 感知代码。

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

这确实影响了程序的主外壳程序(因此不是在所有控件都被压扁的小窗口中加载,主程序窗口打开最大化并显示正常)但是,当我从主窗口输入任何 winforms 子窗体或插件时,缩放失败。

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

有没有人对如何让混合的 winforms/WPF 项目在高 DPI 下正确扩展有任何想法?

提前致谢

当 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 的多显示器设置,这将无法扩展)。

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

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

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

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

[assembly: System.Windows.Media.DisableDpiAwareness]

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

非常感谢您的回答@rohit21agrawal!

我有一个非常相似的复杂 Win Forms 解决方案,每当我在 WeifenLuo 的 DockPanelSuite 中打开停靠的表单时,该表单都会调整大小并弄乱整个 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文件的父级 " <assembly>…</assembly> " 部分

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

再次,非常感谢! 线

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM