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窗体窗口时更改其大小(减小其尺寸).
这怎么可能?我该如何避免这种行为?
您发现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修复.
归档时间: |
|
查看次数: |
1466 次 |
最近记录: |