我在使用ContextMenuStrip
或MenuStrip
时发现了一些奇怪的表单互动。我真的不知道是什么导致了它,所以下面的内容应该为任何看到这个的人创建一个可重复的测试:
我创建了两个Windows窗体:Form1
和Form2
。两者都添加了MenuStrip
。两者都设置为StartPosition
= CenterScreen
。
Form1
有一个简单的菜单:Form2 > Open
。点击“打开”将启动Form2
。
Form2
有一个简单的菜单:Try to open > anotherTestMenuItem
Form1
打开。Form2
打开Form1
(即点击Form2 > Open
)。Form2
出现。Form2
上,尝试打开MenuStrip
(点击Try to open
)。 Form1
会重新显示Form2
,但Form2
仍有焦点(如果您在尝试打开菜单前稍微移动Form2
,则可以看到此内容)。如果我将Form2
的所有者设置为Form1
,则当您尝试步骤4时Form2
仍然可见,但菜单第一次不显示。所有后续点击似乎都很好。
当我尝试打开上下文菜单(在另一个表单打开的表单上)时,我注意到了这一点,它会立即消失,但只是第一次。此后每次都会正常打开。
有没有人知道发生了什么?
答案 0 :(得分:4)
是的,这是.NET 4.5的RTM版本中的一个已知错误。 This KB article提到它:
单击菜单项以在应用程序中打开子窗口时,与菜单和子窗口的交互行为不正确。
例如,您可能会遇到以下情况:
- 在子窗口中打开快捷菜单时,主窗口窗体将成为焦点 - 您不能使用助记符来访问菜单项。
从KB文章可以看出,这个错误已经修复了很久以前。该错误修复程序已合并到2013年1月8日首次提供的维护版本中。请确保允许Windows Update在您的计算机上部署该更新。或者下载from here。
答案 1 :(得分:0)
检查您是否有:
“AutoValidate”设置为“EnablePreventFocusChange”
答案 2 :(得分:0)
确保在菜单项或上下文菜单的项目单击处理程序中未调用其Hide方法。我习惯于在开发过程中执行此操作,以便在逐步调试代码时从屏幕上获得菜单。但是,当我从这样的菜单启动辅助表单时,即使在新表单中左键单击或键入某些内容时,在新表单中的第一次右键单击也会导致焦点恢复为主要表单。我不记得我是在某个地方在线找到该解决方案还是自己发现了它。这可能与上面提到的错误不同,但是在.NET 4.7中仍然会发生这种情况。