Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 混合WPF和winforms项目DPI意识_C#_Wpf_Winforms_.net 4.6_Highdpi - Fatal编程技术网

C# 混合WPF和winforms项目DPI意识

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的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

现在,在尝试了几年不同的方法(但没有一种有效)后,你救了我的命

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

  • a) (我的项目目标是.NET Framework 4.7.2)
  • b) (我的所有表格都设置为AutoScaleMode=Font)
  • 在WinForms项目中,添加对WindowsBase的引用(应该是程序集列表中的最后三个条目)
  • 将“
    [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]