如何防止从关闭菜单中按Enter键

时间:2011-01-26 12:11:26

标签: winforms menu custom-controls

我正在使用Windows.Forms.ToolStripControlHost类将拾色器嵌入到上下文菜单中。选择器显示正常并正确处理所有鼠标事件:

enter image description here

双击其中一个通道滑块时出现问题。这会导致控件将Windows.Forms.TextBox添加到父控件中,其尺寸与滑块相同,因此用户可以输入数值。当TextBox具有焦点时按Enter键时,它应该分配值并隐藏文本框(它会这样做),但它也会关闭整个菜单结构。那么,我如何让菜单保持活力?

enter image description here

涉及了大量代码但如果需要我会发布。

1 个答案:

答案 0 :(得分:1)

不知何故,你需要先按 Enter 按键才能进入上下文菜单。显然,它的默认行为是当用户按下 Enter 时“选择”当前突出显示的项目,就像人类已知的每个其他菜单控件一样。

您可以通过继承ContextMenuStrip控件(如果您还没有这样做)并覆盖其ProcessCmdKey method来实现。请注意与keyData对应的Keys.Enter值,当您检测到该值时,请返回True以指示该控件已处理该字符并阻止其传递给任何进一步处理。当然,其他所有内容都会让基类进程处理,以便其他键(例如箭头键)的行为保持不变。

例如(我刚测试过它并且工作正常):

public class CrazyContextMenuStrip : ContextMenuStrip
{
    protected override bool ProcessCmdKey(ref Message m, Keys keyData)
    {
        if (keyData == Keys.Enter)
        {
            // Eat it when the user presses Enter to
            // prevent the context menu from closing
            return true;
        }

        // Let the base class handle everything else
        return base.ProcessCmdKey(m, keyData);
    }
}

当然,您可以在上面的代码中添加额外的检查,以便只有当您的颜色选择器可见时才会按下 Enter 键,这样就可以按预期工作了所有剩下的部分。时间,