问题描述
前2天公司测试发现,在win7.net framerwork 4.5 一个页面控件显示有问题,而在另一台win7 (netframerwork 4.7)上面也没问题,并且在win10 上也没问题。
问题定位
在查阅资料和发现是wpf 的bug,因为 Popup 的句柄具有 WS_EX_NOACTIVATE 的特性,所以 Popup 是无法获得焦点。在微软的系统,所有的窗口、控件都是有句柄,句柄就是一个指针,获得他才知道是哪个控件。
问题解决
(由于不是我开发的)个人对popup控件内嵌popup我是不喜欢的,所以改了下交互。这里记录下,可以尝试参考站内另一个吧友的解决方法:URL : https://lindexi.blog.csdn.net/article/details/103184961
-
问题补充:2022年1月26日16:28:16
-
在开发中,又有小伙伴遇到了这个问题,就是popup内在嵌套一个popup。经过一天的研究得出了一个结论:第二个popup能不能获得鼠标焦点,取决于第一个popup属性的
StaysOpen
的设置。如果第一个popup设置StaysOpen=true
的话,那么第二个popup是可以获得鼠标焦点的 。所以需要用popup内嵌套popup的话自己要动态控制下第一个popup属性的StaysOpen=true
的状态。 -
排查过程
过程中看了下微软官网的焦点设置方法微软焦点概述链接。并且经过设置,发现第一个popup属性StaysOpen=false
的话,设置键盘焦点和逻辑焦点是能定位到第二个popup的。而第二个popup鼠标焦点还是没有。然后尝试了下,把第一个popup属性设置为StaysOpen=true
发现第二个popup是可以获取到鼠标焦点的。 -
后续:细细想了下,如果第一个popup属性设置为
StaysOpen=false
如果使用win32的api把焦点设置为第二个popup,那么第一个popup失去了焦点,第二个popup也会隐藏,所以使用win32api(上面链接可查看)把第一个popup属性设置为StaysOpen=false
,还想让第二个popup获取鼠标焦点的话,就是一个逻辑错误。
综合以上的分析,结合在排查问题的过程中,难怪翻墙都没有搜索到什么信息,其根本问题还是对popup并不是很了解。才会想出使用一个控件本身并不能满足交互需求的控件来实现这个交互!