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

时间:2015-08-27 07:16:18

标签: c# wpf winforms resize interop

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

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

2 个答案:

答案 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)

正如其他回复所述,因为 DPI意识。一个快速解决方案,为使用VB.NET的人关闭它:

打开 app.manifest

Enter image description here

然后取消注释此部分并将DPI感知设置为 false

Enter image description here

请注意,这可能会导致应用程序的字体在较高的DPI设备上看起来更模糊。