在我创建WPF窗口时,Windows窗体窗口会更改其大小

Nic*_*ick 6 c# wpf interop resize winforms

我有一个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窗体窗口时更改其大小(减小其尺寸).

这怎么可能?我该如何避免这种行为?

Han*_*ant 5

您发现WPF调用SetProcessDPIAware().它发生在PresentationCore的模块初始化程序中.这在形式上是非法的,必须始终在应用创建任何窗口或加载可能缓存DPI值的DLL之前调用它.或者换句话说,很多方法都可能出错,你只是发现它的温和版本.在纯WPF应用程序中通常不会出现问题,因为在创建任何窗口之前总是需要加载PresentationCore.

他们确实留下了一个后门来禁用这种行为.复制/粘贴此代码,最好在EXE项目的AssemblyInfo.cs源文件中:

   [assembly: System.Windows.Media.DisableDpiAwareness]
Run Code Online (Sandbox Code Playgroud)

但这当然不是一个真正的解决方案,DPI虚拟化现在总是为所有窗口启用.通过在其清单中声明您的应用程序dpi-aware来获得提升,以便PresentationCore不会搞砸它.但是,由于不可避免的副作用,您现在将发现需要修复Winforms UI.它只能在您更改Form.AutoScaleMode属性时变小,或者像硬编码窗口大小那样做一些不明智的事情.该属性是Q&D修复.