cap*_*923 11 wpf remote-desktop reconnect onunload windows-8.1
这只是Win8.1中的一个奇怪问题.
众所周知,如果计算机中存在正在运行的应用程序,当我们通过远程桌面连接连接/断开/重新连接到此计算机时,应该不会对应用程序执行任何其他行为.但是,当我们关闭并使用RDC重新连接到计算机时,我们发现Win8.1将触发卸载并将事件加载到WPF应用程序.这是一种不必要的行为,可能会导致错误.
以下是稳定的重现步骤:
如果WPF应用程序在Win7或Win server 2008中运行,则不会触发这些事件.
所以,我认为这是Win8.1中不需要的行为.这是Win8.1 RDP中的错误吗?或者这是一个新功能?
这是因为重新连接 RDP 会通知 WPF 代码会话和屏幕已更改。WPF 需要重建其 DirectX 资源并可能处理更新的屏幕尺寸(即使分辨率可能相同)。这是有道理的 b/c RDP 客户端可以从 RDP“体验”选项卡指定不同的功能,例如图形级别和其他属性。WPF 无法确定参数是否与上次发生连接时完全相同,并且会触发新的渲染和布局周期(这是有道理的,因为颜色和屏幕分辨率可能已更改)。这会导致重新加载控件并触发新的 Loaded 事件。
您可以通过检查 .NET 源代码中的 HwndTarget.cs 来了解其中的许多血腥细节。在此文件中搜索“会话”,您会看到很多会话断开/重新连接的处理。
如果你想找到一种方法来避免在你的加载/卸载代码中做额外的工作,你可能必须将它移动到一个函数中,你确保你只通过标志或空检查调用一次。
您可以通过在 Loaded 事件处理程序上添加断点并转到“工具”>“选项”、“调试”并取消选中“启用仅我的代码”,然后选中“启用 .NET 框架源步进”并选中“启用源服务器”来见证发生的情况支持。当您连接 RDP 时,bkpt 将触发,调用堆栈将在其他级别的调用中显示调整大小事件。这可能是由于 WPF 也获得了 WM_DISPLAYCHANGE 并且重新布局了所有内容,以防此连接的分辨率或多或少。
| 归档时间: |
|
| 查看次数: |
395 次 |
| 最近记录: |