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
,在这里我可以处理每个按钮的点击。当我收到第一个事件时,我创建了一个新的WPFSystem.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