Winforms Panel.Dispose关闭关联菜单,为什么?

Winforms Panel.Dispose关闭关联菜单,为什么?,winforms,focus,contextmenu,dispose,toolstripcontrolhost,Winforms,Focus,Contextmenu,Dispose,Toolstripcontrolhost,根据Cody对的回答,我从ContextMenuStrip派生了一个类并处理ProcessCmdKey。当嵌入菜单中的文本框具有焦点时,按Enter键可成功防止菜单关闭。所以除了一件事,一切都很好 按Enter键后,我将文本框从菜单中删除,处理此控件将导致菜单关闭。当我这样做时: If (m_inputPanel IsNot Nothing) Then m_inputPanel.Hide() If (m_inputPanel IsNot Nothing) Then m_inputPanel.Pa

根据Cody对的回答,我从ContextMenuStrip派生了一个类并处理ProcessCmdKey。当嵌入菜单中的文本框具有焦点时,按Enter键可成功防止菜单关闭。所以除了一件事,一切都很好

按Enter键后,我将文本框从菜单中删除,处理此控件将导致菜单关闭。当我这样做时:

If (m_inputPanel IsNot Nothing) Then m_inputPanel.Hide()
If (m_inputPanel IsNot Nothing) Then m_inputPanel.Parent.Controls.Remove(m_inputPanel)
If (m_inputPanel IsNot Nothing) Then m_inputPanel.Dispose()
菜单关闭了。当我注释掉第三行时,菜单保持打开状态。(顺便提一下,m_inputPanel.Parent是一个自定义控件,它使用ToolStripControlHost嵌入菜单中)


为什么在上帝的绿色地球上,我处理一个不再是菜单一部分的控件很重要?

当你这样做时,你正在从上下文菜单中移除焦点,由于删除时文本框具有焦点,因此
ContextMenuStrip
中没有任何内容具有焦点。

因此,不处理文本框,而是将其作为控件从菜单中删除不会删除焦点?嗯,奇怪。虽然它解释了发生的事情。在处理之前,我会尝试将焦点放回菜单,看看是否有帮助。@DavidRutten这是一个有趣的问题,我想这是一些奇怪的控件警告。这是一个很好的理论。不幸的是,当面板隐藏且未处理时,也应关闭CMS。检查此答案以获得更好的方式:我刚刚注意到此问题,并感到有点被迫回答,因为我是给您提供原始解决方案的人。在这种情况下,我同意汉斯的观点。我试图在对您上一个问题的评论中指出,我不认为使用
ContextMenuStrip
是解决您问题的最佳通用方法,但由于即时解决方案非常简单,我试图提供一个有用的答案。如果你浪费了很多时间让CMS工作,我很抱歉。我不知道这里有什么解决办法;我自己不太使用CMS有多种原因,包括Hans和Cody讨论的脆弱行为,一点也不。我非常感谢你的回答。处理问题可能会被克服,即使没有,我总能找到一种方法,将这些控件添加到某种列表中,以便在关闭菜单后处理。