[WPF] ListBox 的双击事件处理

陪她去流浪 桃子 2017年09月18日 编辑 阅读次数:4970

简单记录下 WPF 中的 ListBox 双击事件的处理,适用于数据源的方式。

处理 ListBox 的双击事件

事件名称:MouseDoubleClick

函数原型:private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)

实参 senderListBox 实例(本文中名为 listbox)。e 为鼠标相关信息,可以通过 ChangedButton 来判断是哪个键按下了等等。

得到当前的双击项

ListBox 有 SelectedItem 属性 和 SelectedIndex 属性。 前者的值为对应的数据源的数据类型,后者的值为选中项的索引(从 0 开始,-1 为未选中)。

值得一提的是:双击 ListBox 的空白区域触发这个事件的时候,以上两个值仍然是当前选中项,并非无效。 所以还需要多一步操作:判断双击的时候鼠标是否的选中项控件内。

取得选中索引

1
var index = listbox.SelectedIndex;

取得索引对应的 ListBoxItem 容器

因为是采用数据源的方式,所以这个容器不能直接获取到。它需要调用 ContainerFromIndex 来获取。

1
var item = listbox.ItemContainerGenerator.ContainerFromIndex(index) as ListBoxItem;

判断是否鼠标双击时的项

这个比较简单,所有的控件都可以这样来做。

1
2
3
if(item.IsMouseOver) {

}

取得双击时的数据项

有多种方式。

  • 上面选中项的数据上下文:item.DataContext
  • ListBox 的当前选中数据:listbox.SelectedItem

完整参考代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
if(listbox.SelectedIndex != -1)
{
	// 取得容器控件
    var item = listbox.ItemContainerGenerator.ContainerFromIndex(listbox.SelectedIndex) as ListBoxItem;
    // 控件不为空 && 鼠标在控件内 && 左键按下
    if(item != null && item.IsMouseOver && e.ChangedButton == MouseButton.Left)
    {
        var data = item.DataContext;
        // 处理数据项
    }
}

标签:WPF · ListBox