C# 为什么在listBox上单击鼠标右键时,它在listBox区域的任何位置都起作用?

C# 为什么在listBox上单击鼠标右键时,它在listBox区域的任何位置都起作用?,c#,C#,我在表格1中有两个事件: private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) { //clear the menu and add custom items contextMenuStrip1.Items.Clear(); contextMenuStrip1.Items.Add(string.Format("Edit

我在表格1中有两个事件:

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
        {
            //clear the menu and add custom items
            contextMenuStrip1.Items.Clear();
            contextMenuStrip1.Items.Add(string.Format("Edit - {0}", listBox1.SelectedItem.ToString()));
        }

        private void listBox1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Right)
            {
                int index = listBox1.IndexFromPoint(e.Location);
                if (index == -1) return;
                contextMenuStrip1.Show(listBox1,listBox1.PointToClient(System.Windows.Forms.Cursor.Position));                
            }
        }
在设计器中,我有一个ContextMenuStrip和一个listBox控件

我需要它做的是,当我在列表框区域的任何地方单击鼠标右键时,它不会做任何事情。但是,如果我只单击列表框中的选定项,则会显示contextMenuStrip。仅当鼠标位于列表框中选定项的上方/上方时

当我的程序已经运行时,第一个项目被选中,因此我需要在运行程序后,如果我将鼠标移到所选项目上方并单击鼠标右键,它将工作。如果我不在所选项目上,它将无法工作。我的意思是,只有当鼠标光标位于所选项目上方时,右键单击才会起作用并显示contextmenustrip


如果我现在将鼠标放在所选项目上,如果我现在单击鼠标右键,则不会将鼠标移到所选项目上。

ListBox.IndexFromPoint在接受方面非常自由。超出列表中最后一项的位置将返回最后一项的索引。您可以通过双击返回项目的位置与鼠标位置来修复此问题,如下所示:

    private void listBox1_MouseDown(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Right) {
            var idx = listBox1.IndexFromPoint(e.Location);
            if (idx >= 0 && listBox1.GetItemRectangle(idx).Contains(e.Location)) {
                listBox1.SelectedIndex = idx;
                contextMenuStrip1.Show(listBox1, e.Location);
            }
        }
    }

请注意,我没有按照您的请求强制用户只单击所选项目。放弃这样的用户操作是不合理的,简单地选择单击的项目更直观。如果不想这样做,请将GetItemRectangle调用更改为使用listBox1.SelectedIndex而不是idx。只要确保在没有选定项目的情况下您不会遇到麻烦。

现在我可以单击列表框中的任意位置,它将显示contextmenustrip,这不是我需要的。我将事件更改为MouseDown,并使用了您的代码。也许强制用户只点击所选项目不是个好主意,但现在我可以在列表框的任何位置点击右键。我点击的任何位置都会显示contextmenustrip,而且每次点击右键时,contextmenustrip都会显示在列表框的另一个位置,而不是鼠标所在的位置是。当我单击文件查看文件属性时,它如何在硬盘上的文件上工作?我现在查过了。当我用鼠标在一个特定的文件上移动时,该文件会被涂上一些浅蓝色,然后单击鼠标右键,打开一个菜单,从该文件向下显示一些属性。我想这也是我想要的。主要的想法是让用户选择从列表框中删除/删除项目。我不知道你在说什么。发布的代码肯定会在鼠标位置显示上下文菜单,注意它是如何将e.Location传递给show方法的。Windows资源管理器不使用列表框。