WPF ListView ScrollViewer双击事件

WPF ListView ScrollViewer双击事件,wpf,listview,scrollviewer,double-click,Wpf,Listview,Scrollviewer,Double Click,执行以下操作将重现我的问题: 新WPF项目 添加列表视图 将列表视图命名为:x:Name=“lvList” 将足够的ListViewItems添加到ListView,以完全填充列表,以便在运行时显示垂直滚动条 将此代码放入lvList.MouseDoubleClick事件中 打印(“双击已发生”) 运行应用程序 双击滚动条的较大更改区域(而不是滚动条本身) 注意,即时窗口打印ListView的双击消息 如何更改此行为,使MouseDoubleClick仅在鼠标“在”ListViewIte

执行以下操作将重现我的问题:

  • 新WPF项目
  • 添加列表视图
  • 将列表视图命名为:x:Name=“lvList”
  • 将足够的ListViewItems添加到ListView,以完全填充列表,以便在运行时显示垂直滚动条
  • 将此代码放入lvList.MouseDoubleClick事件中
打印(“双击已发生”)

  • 运行应用程序
  • 双击滚动条的较大更改区域(而不是滚动条本身)
  • 注意,即时窗口打印ListView的双击消息

如何更改此行为,使MouseDoubleClick仅在鼠标“在”ListViewItems上时发生,而不是在连续单击ScrollViewer以在列表中向下/向上滚动时发生?

您无法更改此行为,因为MouseDoubleClick处理程序已连接到ListView控件,因此,每当单击ListView时,它都必须出现在任何地方。您可以做的是检测ListView的哪个元素首先检测到双击,并从中判断它是否是ListViewItem。下面是一个简单的示例(省略错误检查):


注意使用e.OriginalSource查找双击的实际元素。这通常是一些非常低级的东西,如矩形或文本块,因此我们使用VisualTreeHelper向上走到包含控件。在我的简单示例中,我假设我们遇到的第一个控件是ListViewItem,如果您处理的是包含文本框或复选框的CellTemplates,则可能不是这种情况。但是您可以很容易地改进测试,使其只查找ListViewItems——但是在这种情况下,不要忘记处理这样的情况:单击在任何ListViewItem之外,搜索最终会命中ListView本身。

我没有VS handy来测试这是否有效,但是您是否尝试过在ListViewItems而不是ListView本身上处理双击事件

<ListView ListViewItem.MouseDoubleClick="lv_MouseDoubleClick" ... />

应该在ListView中的任何子ListViewItem控件上处理MouseDoubleClick事件。让我们知道它是否有效

也许这有帮助

Private Sub LstView_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles LstView.MouseDoubleClick
    Dim source As FrameworkElement = TryCast(e.OriginalSource, FrameworkElement)
    If IsNothing(source) Then Return

    Dim TmplParent As DependencyObject = TryCast(source.TemplatedParent, DependencyObject)
    If IsNothing(TmplParent) Then Return
    If Not TmplParent.GetType.Equals(GetType(System.Windows.Controls.ListViewItem)) Then e.Handled = True
End Sub

如果应用此样式,它将起作用。只需双击listview中的项即可


此外,您还必须从listview中删除双击。

我对此进行了快速测试,它似乎仍然会引发listview中任何位置的事件,而不仅仅是ListViewItems。我想值得一试。不管怎么说,我都会把答案留在这里。这就是答案。我只是在选择的情况下抛出过滤掉任何“滚动条”元素,我很好去。非常感谢。
Private Sub LstView_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles LstView.MouseDoubleClick
    Dim source As FrameworkElement = TryCast(e.OriginalSource, FrameworkElement)
    If IsNothing(source) Then Return

    Dim TmplParent As DependencyObject = TryCast(source.TemplatedParent, DependencyObject)
    If IsNothing(TmplParent) Then Return
    If Not TmplParent.GetType.Equals(GetType(System.Windows.Controls.ListViewItem)) Then e.Handled = True
End Sub
  <Style TargetType="{x:Type ListViewItem}">           
            <EventSetter Event="MouseDoubleClick" Handler="OnListViewDoubleClick" />
        </Style>