1

我有一个项目的列表视图,我想要它,这样当用户右键单击其中一个项目时,它会弹出一个上下文菜单条,其中包含用户可以执行的一些选项或任务,但我希望它只当一个项目被 r-click 时,带来 contextmenustrip,而不是空白。有这个设置吗?

4

2 回答 2

1

你必须自己做。这有点痛苦。基本流程是这样...

  1. 创建一个名为 contextMenuAllowed 的全局布尔值。
  2. 订阅 的MouseDown事件ListViewHitTest使用鼠标的ListView坐标(eX 和 eY)做一个。如果他们点击了一个项目并且这是一次右键单击,请将 contextMenuAllowed 设置为 true。
  3. 订阅 的MouseUp事件ListView。如果是鼠标右键,则将 contextMenuAllowed 设置为 false。
  4. 订阅/的Opening事件。如果 contextMenuAllowed 为 false,则将 e.Cancel 设置为 true 并返回。这是阻止上下文菜单实际打开。ContextMenuContextMenuStrip

这有点痛苦,但很容易做到,用户永远不会知道其中的区别。

这是一个示例,我刚刚制作了一个新的自定义控件,它将完全符合您的要求:

using System;
using System.Windows.Forms;

public class CustomListView : ListView
{
    private bool contextMenuAllowed = false;

    public override ContextMenuStrip ContextMenuStrip
    {
        get
        {
            return base.ContextMenuStrip;
        }
        set
        {
            base.ContextMenuStrip = value;
            base.ContextMenuStrip.Opening += ContextMenuStrip_Opening;
        }
    }   

    public CustomListView()
    {
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            ListViewHitTestInfo lvhti = HitTest(e.X, e.Y);
            if (lvhti.Item != null)
            {
                contextMenuAllowed = true;
            }
        }

        base.OnMouseDown(e);
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Right)
        {
            contextMenuAllowed = false;
        }

        base.OnMouseUp(e);
    }

    private void ContextMenuStrip_Opening(object sender, System.ComponentModel.CancelEventArgs e)
    {
        if (!contextMenuAllowed)
            e.Cancel = true;
    }
}
于 2013-08-29T18:56:32.257 回答
1

有一个非常简单的方法可以做到这一点:

  1. 将上下文菜单分配给 ListView 对象的 ContextMenuStrip 属性(这可以在 GUI 设置中完成)

  2. 处理上下文菜单对象的 Opening 事件,并在事件处理程序内部检查是否选择了 ListView 对象的任何项。如果不是这种情况,请取消事件:

    If myListView.SelectedItems.Count = 0 Then e.Cancel = True

于 2017-10-16T08:48:00.393 回答