为何进入包含System.Windows.Clipboard.SetText的方法会改变WinForms窗体缩放
问题原因
你遇到的窗体缩放问题是剪贴板类引用错误+DPI感知模式冲突导致的,具体逻辑如下:
- 你当前是WinForm项目,代码里调用的
System.Windows.Clipboard属于WPF框架的PresentationCore.dll程序集,不是WinForm原生的剪贴板类 - .NET运行时会在方法第一次执行前进行JIT编译,同时加载该方法用到的所有类型对应的依赖程序集,所以你刚进入方法、还没执行任何代码行时,JIT已经完成了
PresentationCore.dll的加载 - WPF程序集加载时会自动初始化WPF的高DPI感知逻辑,和你当前WinForm项目默认的DPI感知模式不兼容,触发系统对窗体进行强制DPI缩放,最终表现为窗体缩小20%左右
- 注释掉剪贴板调用行后,JIT编译方法时不会加载WPF相关程序集,自然不会触发DPI适配逻辑,窗体就不会变化
解决方案
直接替换剪贴板调用为WinForm原生的剪贴板类即可,无需修改其他逻辑:
public override void copyXmlTextToClipboard() { string xmlText = xmlNode.OuterXml; // 替换为WinForm原生剪贴板类,不会加载WPF程序集 System.Windows.Forms.Clipboard.SetText(xmlText); }
如果后续仍存在高DPI适配问题,可以在项目中添加应用程序清单(app.manifest),开启WinForm的高DPI适配:
<application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware> </windowsSettings> </application>
内容的提问来源于stack exchange,提问作者Christopher Hamkins
相关产品推荐
相关产品推荐

