【发布时间】:2011-05-26 03:52:45
【问题描述】:
我有一个包含一些项目的列表框。无论如何我可以为每个项目附加一个双击事件吗?
Item 1
Item 2
Item 3
如果我要双击第 2 项,会弹出一个显示“第 2 项”的消息框
我该怎么做?
【问题讨论】:
标签: c# events listbox listboxitem double-click
我有一个包含一些项目的列表框。无论如何我可以为每个项目附加一个双击事件吗?
Item 1
Item 2
Item 3
如果我要双击第 2 项,会弹出一个显示“第 2 项”的消息框
我该怎么做?
【问题讨论】:
标签: c# events listbox listboxitem double-click
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());
}
}
这应该可以工作...检查
【讨论】:
e.Location!?!?!?你确定有这个方法吗? Visual Studio 没有通过 ctrl+space 向我建议这种方法!
SelectedItem?
SelectedItem可能不是null。
IndexFromPoint 是什么?
WinForms
为ListBox 的Control.DoubleClick 事件添加一个事件处理程序,并在该事件处理程序中打开一个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 event 代替:
ListBox1.MouseDoubleClick += new RoutedEventHandler(ListBox1_MouseDoubleClick);
以及事件处理程序:
private void ListBox1_MouseDoubleClick(object sender, RoutedEventArgs e)
{
if (ListBox1.SelectedItem != null)
{
MessageBox.Show(ListBox1.SelectedItem.ToString());
}
}
编辑:Sisya's answer 检查是否在某个项目上发生了双击,这需要将其合并到此代码中以解决 cmets 中提到的问题(如果在一个项目时双击 ListBox,则会显示消息框被选中,但未在项目上单击)。
希望这会有所帮助!
【讨论】:
我知道这个问题已经很老了,但我也在寻找解决这个问题的方法。公认的解决方案是针对 WinForms 而不是 WPF,我认为许多来这里的人都在寻找。
对于正在寻找 WPF 解决方案的任何人,这是一个很好的方法(通过 Oskar 的回答 here):
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)。
【讨论】:
对于 Winform
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);
}
如果您选择一个项目然后单击空白区域,这也应该防止事件触发。
【讨论】:
这取决于你是否是System.Windows.Forms.ListBox 类的ListBox 对象,它确实有ListBox.IndexFromPoint() 方法。但如果 ListBox 对象来自 System.Windows.Control.Listbox 类,则来自 @dark-knight 的答案(标记为正确答案)不起作用。
我正在运行 Win 10 (1903) 和当前版本的 .NET 框架 (4.8)。不过,此问题不应该与版本相关,仅取决于您的应用程序是使用 WPF 还是 Windows 窗体作为 UI。 另见:WPF vs Windows Form
【讨论】:
这是一个很老的帖子,但如果有人遇到类似的问题并需要快速回答:
listBox1.IndexFromPoint(new Point(e.X,e.Y))>=0
e.Clicks == 2
【讨论】: