菜单单击导致表单"lose focus",菜单下拉列表消失



在使用ContextMenuStripMenuStrip时,我注意到了一些奇怪的形式交互。我真的不知道是什么导致了它,所以下面应该为任何研究这个问题的人创建一个可重复的测试:

我已经创建了两个Windows窗体:Form1Form2。两者都添加了一个MenuStrip。两者都被设置为StartPositionCenterScreen

Form1有一个类似的简单菜单:Form2 > Open。单击"打开"将启动Form2

Form2有一个简单的菜单,如下所示:Try to open > anotherTestMenuItem

  1. 启动程序。Form1打开
  2. Form1打开Form2(即单击Form2 > Open)
  3. 出现Form2
  4. Form2上,尝试打开MenuStrip(单击Try to open)。Form1将重新出现在Form2上,尽管Form2仍然有焦点(如果在尝试打开菜单之前稍微移动Form2,您可以看到这一点)

如果我将Form2的所有者设置为Form1,则在尝试步骤4时,Form2仍然可见,但菜单不会第一次显示。所有随后的点击似乎都很好。

当我尝试打开上下文菜单(在另一个表单打开的表单上)时,我注意到了这一点,它会立即消失,但这只是第一次。此后,它每次都会正常打开。

有人知道发生了什么事吗?

是的,这是.NET 4.5 RTM版本中的一个已知错误。这篇KB文章提到:

单击菜单项以打开应用程序中的子窗口时,与菜单和子窗口的交互行为不正确

例如,您可能会遇到以下情况:
-当您在子窗口中打开快捷菜单时,主窗口窗体将成为焦点
-您不能使用助记符来访问菜单项。

从KB文章中可以看出,这个错误很早以前就被修复了。2013年1月8日首次发布的维护版本中包含了该漏洞修复。请确保允许Windows Update在您的计算机上部署该更新。或者从这里下载。

检查是否有:

"AutoValidate"设置为"EnablePreventFocusChange">

确保在菜单或上下文菜单的项目单击处理程序中没有调用Hide方法。我习惯于在开发过程中这样做,以便在调试代码时从屏幕上获得菜单。然而,当我从这样的菜单启动辅助窗体时,在新窗体中第一次右键单击会导致焦点恢复到主窗体,有时即使我在新窗体上左键单击或键入了一些内容。我不记得是在网上找到了这个解决方案,还是自己发现了它。这可能与上面提到的错误不同,但这种行为在.NET 4.7中仍然存在。

相关内容

  • 没有找到相关文章

最新更新