C# 混合WPF和winforms项目DPI意识
我有一个同时使用winforms和WPF的C#程序,我正在努力让它在高DPI环境中工作。 目前,如果我从解决方案中删除所有WPF项目并运行它,它将可以很好地扩展,但是一旦我重新添加任何WPF(功能所必需的),扩展就会失败,UI将变得不可用 这似乎与之前的SO问题完全相同:以及 我按照这些问题的建议,尝试添加一个清单文件和提供的支持dpi的代码 我还将该项目升级到.net framework 4.6.1(从4.0版开始),并包括app.config设置:C# 混合WPF和winforms项目DPI意识,c#,wpf,winforms,.net-4.6,highdpi,C#,Wpf,Winforms,.net 4.6,Highdpi,我有一个同时使用winforms和WPF的C#程序,我正在努力让它在高DPI环境中工作。 目前,如果我从解决方案中删除所有WPF项目并运行它,它将可以很好地扩展,但是一旦我重新添加任何WPF(功能所必需的),扩展就会失败,UI将变得不可用 这似乎与之前的SO问题完全相同:以及 我按照这些问题的建议,尝试添加一个清单文件和提供的支持dpi的代码 我还将该项目升级到.net framework 4.6.1(从4.0版开始),并包括app.config设置: 这确实影响了程序的主外壳(因此,主程序窗口
这确实影响了程序的主外壳(因此,主程序窗口不是在所有控件都被压扁的情况下加载到一个小窗口中,而是最大化打开并显示为正常),但是,当我从主窗口输入任何winforms子窗体或插件时,缩放失败
当我输入任何WPF子表单或插件,或返回到主屏幕时,这些都会正确呈现。只有winforms功能无法正确扩展
有人对如何让混合winforms/WPF项目在高DPI下正确扩展有什么想法吗?
提前感谢当WPF加载到项目中时,它会将流程提升为系统DPI感知。为了解决这个问题,首先: 1) 在条目程序集中的命名空间声明上方设置[assembly:DisabledPiaware]属性 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。一旦主shell项目用WPF重新编写,所有的“插件”都以正确的DPI比例出现
考虑到它涉及到对现有代码的重写,这并不是我所知道的最好的修复方法,但是这是为我们解决问题的唯一方法。非常感谢您的回答@rohit21agrawal 我有一个非常类似的复杂Win Forms解决方案,每当我在Weifenlo的DockPanelSuite中打开一个停靠表单时,表单就会调整大小并扰乱整个GUI 现在,在尝试了几年不同的方法(但没有一种有效)后,你救了我的命 除了回答其他所有想知道如何完成解决方案的开发人员的问题外:
[assembly:System.Windows.Media.DisabledPiaware]
”添加到您的AssemblyInfo.cs
对/下午
进入您的应用程序清单文件的家长“…
”部分
就我而言,这就像一个符咒:——)
最终,我能够在不同的显示器之间移动表单(一个4K,175%,另一个全高清,125%字体比例),它立即重画/重新渲染所有控件
再次感谢大家!
Cordt如果由于您是WinForms应用程序而不是WPF应用程序而没有清单文件,则必须通过AssemblyInfo.cs进行更改。因为它是在相反的方向,你必须禁用DPI感知来让世界同步,而不是像上面的WPF方法那样启用它 在AssemblyInfo.cs中,添加以下行
[assembly: System.Windows.Media.DisableDpiAwareness]
我的问题被标记为重复,但不是真正的重复,因为我有一个使用WPF组件的WinForms应用程序,而不是相反。我为像我这样因为错误原因被引导到这里的人添加了这个答案。如果你认为这是一个更好的方法,好的。我发布了一个新问题,因为我假设我有一个不同的问题,因为他们的解决方案对我不起作用。这是引用的问题“”的答案,我已经声明该问题对我不起作用。@AnyaHope注意到了区别。我说过你需要设置为true/PM not true。true/PM表示每个监视器感知,而true表示系统DPI感知。对不起,您是对的。我没有注意到。不幸的是,在我尝试配置设置时,我确实尝试使用了所有不同的可能值,但遗憾的是没有一个有效。@AnyaHope我很惊讶它不起作用。实现这一点的另一种方法是在条目程序集中设置[assembly:DisabledPiaware]属性。非常感谢您为我所做的尝试。我要试试这个。我想我之所以在让它工作上遇到如此多的困难,是因为我正在开发的应用程序的性质。这是一个非常复杂的解决方案,有几十个“插件”项目。我肯定我错过了什么。我的项目正是在我开始的时候。Winforms base、WPF组件,所以我真的很高兴在这里为处于相同情况的其他人提供了这些组件。谢谢你的发帖
[assembly: System.Windows.Media.DisableDpiAwareness]