6

我有一个简单的下拉样式的 ComboBox。当用户右键单击列表中的项目时,我想打开一个新窗口,但是无法让它检测到发生了右键单击。

我的代码:

private void cmbCardList_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right && cmbCardList.SelectedIndex != -1)
    {
        frmViewCard vc = new frmViewCard();
        vc.updateCardDisplay(cmbCardList.SelectedItem);
        vc.Show();
    }
}

如果我改变 e.Button == MouseButtons.Left 整个事情就很好了。有什么办法可以让我按我的意愿工作吗?

4

3 回答 3

9

恐怕除非您进行一些严重的黑客攻击,否则这是不可能的。这篇文章会解释。

为您引用:

单独控制

以下控件不符合标准的鼠标单击事件行为:

Button、CheckBox、ComboBox和 RadioButton 控件

  • 左键单击:单击,鼠标单击

  • 右键单击:未引发单击事件

  • 左键双击:Click、MouseClick;点击,鼠标点击

  • 右键双击:不引发点击事件

于 2009-10-17T07:18:24.597 回答
6

作为这个问题的墓志铭,您可以使用正常的 .NET 功能来完成这项工作;您只需要更深入地了解事件调用堆栈。处理 MouseDown 事件,而不是处理 MouseClick 事件。我最近不得不做一些类似的事情,我只是覆盖了 OnMouseDown 方法而不是附加一个处理程序。但是,处理程序也应该工作。这是代码:

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right && !HandlingRightClick)
        {
            HandlingRightClick = true;
            if (!cmsRightClickMenu.Visible)
                cmsRightClickMenu.Show(this, e.Location);
            else cmsRightClickMenu.Hide();
        }
        base.OnMouseDown(e);
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        HandlingRightClick = false;
        base.OnMouseUp(e);
    }

    private bool HandlingRightClick { get; set; }

HandlerRightClick 属性是为了防止 OnMouseDown 逻辑的多次触发;UI 将发送多个 MouseDown 消息,这可能会干扰隐藏右键菜单。为了防止这种情况,我只在第一个 MouseDown 触发器上执行一次逻辑(逻辑很简单,我不在乎两个调用是否发生竞争,但你可能会),然后忽略任何其他 MouseDown 触发器,直到 MouseUp 发生。它并不完美,但这会做你需要的。

于 2011-08-12T19:07:51.400 回答
0

您可以使用ContextMenuStrip的Opening事件来处理右键事件。

var chk = new CheckBox();
chk.ContextMenuStrip = cmsNone;

private void cmsNone_Opening(object sender, CancelEventArgs e)
{
    e.Cancel = true;
    var cms = (ContextMenuStrip)sender;
    var chk = cms.SourceControl;
    //do your stuff
}
于 2013-10-14T07:14:13.863 回答