我在C#中有一个表单应用程序.当我更改显示器的DPI时,所有控件都会移动.我使用了代码this.AutoScaleMode = AutoScaleMode.Dpi,但它没有避免这个问题.
有没有人有想法?
在这篇文章中,CodeNaked讨论了如何更改应用程序的TextFormattingModeProperty.这完全解决了我的问题(见下文).Net 4.然而我的生产应用程序是在.Net 3.5中,根本没有该属性.我如何在.Net 3.5中完成同样的事情?
我的根本问题:
我有一个基于.Net 3.5的winforms应用程序,在某些屏幕上有一些WPF控件.当Windows DPI设置设置为150%(而不是120%)时,会按预期进行缩放.但是,只要创建了WPF控件,所有窗口的缩放比例都会设置为100%.我希望缩放保持不变.
我创建了一个测试应用程序来演示.默认情况下,它会打开一个winform,其中包含一个按钮,该按钮将使用wpf控件打开另一个winform.保持不变,打开第二个表单将导致缩放恢复到100%.但是,如果取消注释Form1.vb中的第11行,则在打开第二个表单时将继续正确进行缩放.
Dim newApp As New App() 'Uncomment to fix automatic scaling
班级应用:
Imports System.Windows
Imports System.Windows.Media
Partial Public Class App
    Inherits Application
    Public Sub App()
        TextOptions.TextFormattingModeProperty.OverrideMetadata(GetType(Window), New FrameworkPropertyMetadata(TextFormattingMode.Display, FrameworkPropertyMetadataOptions.AffectsMeasure Or FrameworkPropertyMetadataOptions.AffectsRender Or FrameworkPropertyMetadataOptions.Inherits))
    End Sub
End Class
我有一个使用winforms和WPF的C#程序,我很难让它在高DPI环境中工作.目前,如果我从解决方案中删除所有WPF项目并运行它,它将可以很好地扩展,但是一旦我添加任何wpf(功能必需),扩展失败并且UI变得不可用.
这似乎与之前的SO问题完全相同:混合WinForms和WPF应用程序中的.Net 3.5中的DPI缩放以及使用DPI正确扩展WinForms的问题
我按照有关这些问题的建议,尝试添加清单文件和提供的dpi识别代码.
我还将项目升级到.net framework 4.6.1(从4.0开始)并包含了app.config设置: <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
这确实影响了程序的主shell(因此,不是在一个小窗口中加载所有控件被压缩,主程序窗口打开最大化并显示正常)但是,当我从主窗口输入任何winforms子窗体或插件时,缩放失败.
当我输入任何WPF子窗体或插件,或返回到主屏幕时,这些渲染正确.只有winforms功能无法正确扩展.
有没有人对如何让混合winforms/WPF项目在高DPI中正确扩展有任何想法?
提前致谢