58

我有一个包含一些项目的列表框。无论如何我可以为每个项目附加一个双击事件吗?

Item 1
Item 2
Item 3

如果我要双击第 2 项,会弹出一个显示“第 2 项”的消息框

我该怎么做?

4

6 回答 6

127
void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{
    int index = this.listBox1.IndexFromPoint(e.Location);
    if (index != System.Windows.Forms.ListBox.NoMatches)
    {
        MessageBox.Show(index.ToString());
    }
}

这应该工作......检查

于 2010-12-15T20:24:12.890 回答
28

WinForms

Control.DoubleClick为您的事件添加一个事件处理程序ListBox,并在该事件处理程序中打开一个MessageBox显示所选项目。

例如:

 private void ListBox1_DoubleClick(object sender, EventArgs e)
 {
     if (ListBox1.SelectedItem != null)
     {
         MessageBox.Show(ListBox1.SelectedItem.ToString());
     }
 }

ListBox1你的名字在哪里ListBox

请注意,您将像这样分配事件处理程序:

ListBox1.DoubleClick += new EventHandler(ListBox1_DoubleClick);

WPF
与上面几乎相同,但您将使用MouseDoubleClick事件来代替:

ListBox1.MouseDoubleClick += new RoutedEventHandler(ListBox1_MouseDoubleClick);

和事件处理程序:

 private void ListBox1_MouseDoubleClick(object sender, RoutedEventArgs e)
 {
     if (ListBox1.SelectedItem != null)
     {
         MessageBox.Show(ListBox1.SelectedItem.ToString());
     }
 }

编辑:Sisya 的答案检查是否在某个项目上发生了双击,这需要将其合并到此代码中以解决评论中提到的问题(如果在选择项目时双击 ListBox,则会显示消息框,但是未单击项目)。

希望这可以帮助!

于 2010-12-15T20:18:50.910 回答
16

我知道这个问题已经很老了,但我也在寻找解决这个问题的方法。公认的解决方案是针对WinForms而不是 WPF,我认为许多来这里的人都在寻找。

对于正在寻找WPF解决方案的任何人,这是一个很好的方法(通过 Oskar在此处的回答):

private void myListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    DependencyObject obj = (DependencyObject)e.OriginalSource;

    while (obj != null && obj != myListBox)
    {
        if (obj.GetType() == typeof(ListBoxItem))
        {
             // Do something
             break;
         }
         obj = VisualTreeHelper.GetParent(obj);
    }
}

基本上,您沿着 VisualTree 向上走,直到找到作为 ListBoxItem 的父项,或者您向上爬到实际的 ListBox(因此没有单击 ListBoxItem)。

于 2013-10-29T17:39:38.683 回答
9

对于 Winforms

private void listBox1_DoubleClick(object sender, MouseEventArgs e)
    {
        int index = this.listBox1.IndexFromPoint(e.Location);
        if (index != System.Windows.Forms.ListBox.NoMatches)
        {
            MessageBox.Show(listBox1.SelectedItem.ToString());
        }
    }

public Form()
{
    InitializeComponent();
    listBox1.MouseDoubleClick += new MouseEventHandler(listBox1_DoubleClick);
}

如果您选择一个项目然后单击空白区域,那也应该防止事件触发。

于 2012-05-15T13:40:47.470 回答
2

这要看你是不是ListBox对象的System.Windows.Forms.ListBox类,里面确实有ListBox.IndexFromPoint()方法。但是,如果 ListBox 对象来自System.Windows.Control.Listbox该类,则来自 @dark-knight 的答案(标记为正确答案)不起作用。

我正在运行 Win 10 (1903) 和当前版本的 .NET 框架 (4.8)。不过,此问题不应该与版本相关,仅取决于您的应用程序是使用 WPF 还是 Windows 窗体作为 UI。另请参阅:WPF 与 Windows 窗体

于 2019-08-06T19:17:30.970 回答
1

这是一个非常古老的帖子,但如果有人遇到类似问题并需要快速回答:

  • 要捕获是否单击了 ListBox 项,请使用 MouseDown 事件。
  • 要捕获是否单击了某个项目而不是列表框中的空白区域,请检查是否listBox1.IndexFromPoint(new Point(e.X,e.Y))>=0
  • 要捕获双击事件,请检查是否e.Clicks == 2
于 2018-03-25T13:37:14.290 回答