在这篇文章中,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
Run Code Online (Sandbox Code Playgroud)
班级应用:
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
Run Code Online (Sandbox Code Playgroud) 我有一个System.Window.Forms.Form处理每个按钮点击的地方.当我收到第一个事件时,我创建了一个新的WPF System.Windows.Window对象.
class WPF_Window : Window
{
}
public partial class Form1 : Form
{
WPF_Window wnd = null;
public Form1()
{
InitializeComponent();
}
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
if (wnd == null)
{
wnd = new WPF_Window();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的计算机上,此代码按预期工作,但如果我在另一台计算机(Windows 10)上运行它,当我单击Windows窗体窗口时更改其大小(减小其尺寸).
这怎么可能?我该如何避免这种行为?
我有一个使用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中正确扩展有任何想法?
提前致谢