我有一个包含一些项目的列表框。无论如何我可以为每个项目附加一个双击事件吗?
Item 1
Item 2
Item 3
如果我要双击第 2 项,会弹出一个显示“第 2 项”的消息框
我该怎么做?
我有一个包含一些项目的列表框。无论如何我可以为每个项目附加一个双击事件吗?
Item 1
Item 2
Item 3
如果我要双击第 2 项,会弹出一个显示“第 2 项”的消息框
我该怎么做?
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());
}
}
这应该工作......检查
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,则会显示消息框,但是未单击项目)。
希望这可以帮助!
我知道这个问题已经很老了,但我也在寻找解决这个问题的方法。公认的解决方案是针对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)。
对于 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);
}
如果您选择一个项目然后单击空白区域,那也应该防止事件触发。
这要看你是不是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 窗体
这是一个非常古老的帖子,但如果有人遇到类似问题并需要快速回答:
listBox1.IndexFromPoint(new Point(e.X,e.Y))>=0
e.Clicks == 2