我有一个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();
}
}
}
在我的计算机上,此代码按预期工作,但如果我在另一台计算机(Windows 10)上运行它,当我单击Windows窗体时,会更改其大小(减小其尺寸)。
怎么可能?我该如何避免这种行为?
答案 0 :(得分:5)
您发现WPF调用SetProcessDPIAware()。它发生在PresentationCore的模块初始化程序中。这在形式上是非法的,必须始终在应用创建任何窗口或加载可能缓存DPI值的DLL之前调用它。或者换句话说,很多方法都可能出错,你只是发现它的温和版本。在纯WPF应用程序中通常不会出现问题,因为在创建任何窗口之前总是需要加载PresentationCore。
他们确实离开后门来禁用此行为。复制/粘贴此代码,最好在EXE项目的AssemblyInfo.cs源文件中:
[assembly: System.Windows.Media.DisableDpiAwareness]
但这当然不是真正的解决方案,现在总是为所有窗口启用DPI虚拟化。通过在其清单中声明您的应用程序dpi-aware来获得领先,以便PresentationCore无法搞清楚这一点。但是,由于您不可避免的副作用,您现在发现需要修复Winforms UI。它只能在您更改Form.AutoScaleMode属性时变小,或者像硬编码窗口大小那样做一些不明智的事情。该属性是Q& D修复。
答案 1 :(得分:1)