wpf 是什么原因导致VisualTreeHelper::HitTest返回不完整的结果,有时甚至没有结果?

vsaztqbk  于 2023-02-13  发布在  其他
关注(0)|答案(1)|浏览(218)

我曾经有过这样一个场景:为了实现测试自动化,我通过网络连接来驱动UI,从而连接到Windows WPF应用程序。有时候,无论逻辑树或可视化树的外观状态如何,我使用VisualTreeHelper向UI发出的请求都不会返回任何结果。
这不仅仅是一个问题,而是问题解决方案的文档。
我发现我正在检测网络连接的可用性,在它响应后,我立即发出调用,执行VisualTreeHelper并在呈现时捕获UI。该调用的结果不完整,后续调用完全失败(没有找到任何元素)。
我的实际解决方案是在通信打开和第一次调用VisualTreeHelper之间延迟2秒。这消除了过早调用UI导致的奇怪状态。我测试了100次应用程序重启,没有任何问题。
我在谷歌上搜索了这个问题,但没有找到好的结果。
有趣的是,我问了ChatGPT,它告诉我:如果您尝试在视觉化树状结构的项目尚未完全呈现之前存取这些项目,可能会得到非预期的结果,或掷回例外状况。
我让机器人告诉我这个Assert的来源,以及我得到的唯一链接:"以下是Microsoft文档的链接,该文档提到了在完全呈现可视化树之前调用VisualTreeHelper的风险:
https://docs.microsoft.com/en-us/dotnet/api/system.windows.media.visualtreehelper.getchild?view=netcore-3.1#remarks"
可惜这样的链接实际上并没有提到这样的内容,这可能是因为ChatGPT使用了2021年的数据,链接内容也发生了变化。
一个朋友建议我使用archive.log(一个互联网存档)来查看这样的链接的早期版本是否有所需的信息,但没有找到。
ChatGPT提供了相关信息,但无法提供其来源。
最后,我承认,解决在UI完成渲染之前竞相使用VisualTreeHelper的问题的"理想"方法是等待主窗口调用的事件:私有void主窗口加载(对象发送方,路由事件参数e);和门控VisualTreeHelper的任何使用,直到引发此事件。
我的方法并不完全理想,但很少花力气就能实现。2秒的延迟并不会对我的场景产生显著影响。
在我使用VisualTreeHelper等待UI呈现之前延迟了2秒钟之后,我没有任何问题。

cuxqih21

cuxqih211#

简短的回答是(正如您所观察到的),当您试图找到控件时,它们还不存在。
可视化树帮助器使用的可视化树是窗口中UI控件等的对象图。
窗口是一个内容控件。
示例化窗口时,将使用构造函数创建窗口本身。
我不确定是否有一个点可以在可视树中只有窗口本身,但这是概念上的工作方式。
父窗口是第一个,然后是根面板内容和根的内容。
控件的“树”是窗口〉内容面板〉子控件。
构造一个窗口可能需要一段时间。2秒看起来有点慢,但是开发人员倾向于在构造函数中放入各种各样的东西。所花费的时间可能取决于开发人员在其中放入了多少代码,连接速度等等。
这种差异可以解释为什么测试结果会发生变化。
为窗口处理的正确事件应该是contentrendered。顾名思义,它在窗口的所有内容都被呈现之后触发。
对于用户控件或页面,你可以处理已加载的,但是你最好通过使用调度器来延迟处理。已加载并不能保证所有的东西都被呈现。

相关问题