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>