在使用ContextMenuStrip
或MenuStrip
时,我注意到了一些奇怪的形式交互。我真的不知道是什么导致了它,所以下面应该为任何研究这个问题的人创建一个可重复的测试:
我已经创建了两个Windows窗体:Form1
和Form2
。两者都添加了一个MenuStrip
。两者都被设置为StartPosition
=CenterScreen
。
Form1
有一个类似的简单菜单:Form2 > Open
。单击"打开"将启动Form2
。
Form2
有一个简单的菜单,如下所示:Try to open > anotherTestMenuItem
- 启动程序。
Form1
打开 - 从
Form1
打开Form2
(即单击Form2 > Open
) - 出现
Form2
- 在
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中仍然存在。