C# 将单击事件添加到充满代码中对象的列表框中

C# 将单击事件添加到充满代码中对象的列表框中,c#,wpf,events,contextmenu,C#,Wpf,Events,Contextmenu,我试图右键单击列表框中的某个项目时显示上下文菜单。因此,我将“用户”列表绑定到我的列表框。那我就有点迷路了。我想我可以foreach列表并在listboxitems上添加mouserightdown事件,但我不知道如何添加 这是一个好方法,还是有人知道一个更好的方法来实现我想要的 提前感谢。也许您可以从列表框中进入Mousdown事件,选择了witch项。 还是在没有选择项目的情况下单击鼠标右键?我这样做已经有一段时间了,但如果我没记错的话: 您应该在鼠标右键按下时触发事件 找出光标当时的位置

我试图右键单击列表框中的某个项目时显示上下文菜单。因此,我将“用户”列表绑定到我的列表框。那我就有点迷路了。我想我可以foreach列表并在listboxitems上添加mouserightdown事件,但我不知道如何添加

这是一个好方法,还是有人知道一个更好的方法来实现我想要的


提前感谢。

也许您可以从列表框中进入Mousdown事件,选择了witch项。
还是在没有选择项目的情况下单击鼠标右键?

我这样做已经有一段时间了,但如果我没记错的话:

  • 您应该在鼠标右键按下时触发事件
  • 找出光标当时的位置
  • 询问列表框,哪个项目位于这些坐标处
列表框确实有一个方法,我认为

编辑: 这里有一些代码:

    private void listBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button != System.Windows.Forms.MouseButtons.Right)
            return;

        int index = listBox1.IndexFromPoint(e.X, e.Y);

        MessageBox.Show(listBox1.Items[index].ToString());

    }
显然,您需要添加一些错误检查,如果在该点有一个项目等。

这将起作用:

        private void listBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            Point p = new Point(e.X, e.Y);
            listBox1.SelectedIndex = listBox1.IndexFromPoint(p);
            contextMenuStrip1.Show();
        }
    }

编辑:有点太晚了sry;)

这将回答你的问题,我想:


您可以做两件事来解决您遇到的问题:

1) 如果使用usercontrols填充列表框,则可以向其中添加单击事件


2) 如果在列表框中添加contextmenu,右键单击某个项目将自动打开contextmenu,因此您不必向其中添加单击事件。

单击列表框项目时,这些事件不起作用,只有在单击空白区域时。。。我想右键单击列表中的一个项目,并显示一个上下文菜单。嗯,为什么不使用MouseRightButtonDown而不是检查单击了哪个按钮。。。?顺便说一句,我在wpf中工作,它似乎没有IndexFromPoint,因为你没有说你使用wpf。可能有些不同。很好,几乎相同的代码:D,只是我不确定这在WPF中是如何工作的。在XAML中,您必须定义MouseDown或OrMouseDown事件。它非常类似于非WPF代码。它是动态的,不能将事件放入listboxitem或其他任何东西,这取决于项目,因此将其放入XAML将无法工作。只需设置ListBox.ContextMenu属性。看,就是这样,很容易。。。同时,我制作了一个usercontrol,因为我知道您可以向其中添加一个事件,但这正是我需要的,您可以将此作为答案发布,我想接受;)
 private void listBox1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        Point p = new Point(e.X, e.Y);
        listBox1.SelectedIndex = listBox1.IndexFromPoint(p);
        contextMenuStrip1.Show();
    }
}