Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建WPF窗口时,Windows窗体窗口会更改其大小_C#_Wpf_Winforms_Resize_Interop - Fatal编程技术网

C# 创建WPF窗口时,Windows窗体窗口会更改其大小

C# 创建WPF窗口时,Windows窗体窗口会更改其大小,c#,wpf,winforms,resize,interop,C#,Wpf,Winforms,Resize,Interop,我有一个System.Window.Forms.Form,在这里我可以处理每个按钮的点击。当我收到第一个事件时,我创建了一个新的WPFSystem.Windows.Window对象 class WPF_Window : Window { } public partial class Form1 : Form { WPF_Window wnd = null; public Form1() { InitializeComponent(); }

我有一个
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窗体窗口时,它的大小会发生变化(减小其尺寸)


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

这是您可以使用的一些方法。设置窗口的宽度和高度:

public static Graphics graphics = Graphics.FromHwnd(IntPtr.Zero);
public static double GetDIPIndependent(double value, double DPI)
{
    value = value * (graphics.DpiX / DPI);
    return value;
}
public static double GetDIPDependent(double value, double DPI)
{
    value = value * (DPI / graphics.DpiX);
    return value;
}
public static double GetDIPIndependent(double value)
{
    value = value * (graphics.DpiX / 96.0);
    return value;
}

public static double GetDIPDependent(double value)
{
    value = value * (96.0 / graphics.DpiX);
    return value;
}
例子: 如果新闻部独立 如果依赖于DPI
它对我有用…

这是一些你可以使用的方法。设置窗口的宽度和高度:

public static Graphics graphics = Graphics.FromHwnd(IntPtr.Zero);
public static double GetDIPIndependent(double value, double DPI)
{
    value = value * (graphics.DpiX / DPI);
    return value;
}
public static double GetDIPDependent(double value, double DPI)
{
    value = value * (DPI / graphics.DpiX);
    return value;
}
public static double GetDIPIndependent(double value)
{
    value = value * (graphics.DpiX / 96.0);
    return value;
}

public static double GetDIPDependent(double value)
{
    value = value * (96.0 / graphics.DpiX);
    return value;
}
例子: 如果新闻部独立 如果依赖于DPI
它对我有用…

您发现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修复。

您发现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修复。

如其他回复中所述,这是因为DPI意识。对于使用VB.NET的用户,可快速关闭此功能:

打开app.manifest

然后取消对该部分的注释,并将DPI感知设置为false:


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

如其他答复中所述,这是因为DPI意识。对于使用VB.NET的用户,可快速关闭此功能:

打开app.manifest

然后取消对该部分的注释,并将DPI感知设置为false:



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

两台计算机的DPI是否相同?这与DPI有关。当您第一次使用WPF中的程序集时,Windows窗体应用程序将随机调整大小。我的猜测是,您需要在清单中将应用程序声明为不支持DPI。@Ankurtripath实际上,这些计算机具有不同的DPI,将两者都设置为100%可以使应用程序正常工作。但是,在不更改DPI的情况下,如何避免这种行为?@ghord the applicationon是一个WinForms应用程序,我应该在哪里设置它不支持DPI?如何设置?你必须根据DPI设置每个宽度和高度等等,我写了一些代码并给你..两台计算机的DPI相同吗?这和DPI有关。当您第一次使用WPF中的程序集时,Windows窗体应用程序将随机调整大小。我的猜测是,您需要在清单中将应用程序声明为不支持DPI。@Ankurtripath实际上,这些计算机具有不同的DPI,将两者都设置为100%可以使应用程序正常工作。但是,在不更改DPI的情况下,如何避免这种行为?@ghord the applicationon是一个WinForms应用程序,我应该在哪里设置它不支持DPI?如何设置?您必须根据DPI设置每个宽度和高度,等等,我编写一些代码并将其提供给您..宽度和高度是表单属性吗?我应该什么时候设置它们?一旦启动?是宽度和高度是窗体属性..、、、和可以更改此窗口的加载方法。加载+=窗口_加载();它不适用于我,无论是使用GetDIPIndependent还是GetDIPIndependent。。。DPI设置为150%的计算机上的窗口仍会自行调整大小。如果计算机为100%,而您要将宽度设置为800,则它看起来像800。。。但是,如果计算机是150%,您想将宽度设置为800,而不是512(依赖于DIP),请向我显示您设置宽度和高度的代码,并可能显示图像发生了什么..我在初始化Component()后设置宽度和高度(代码与我的问题相同)宽度和高度是表单属性吗?我应该什么时候设置它们?一旦启动?是宽度和高度是窗体属性..、、、和可以更改此窗口的加载方法。加载+=W