WPF ListView ScrollViewer 双击事件

4
以下操作将重现我的问题:
  • 新建WPF项目
  • 添加ListView
  • 将listview命名为:x:Name="lvList"
  • 向ListView中添加足够多的ListViewItems以完全填充列表,以便在运行时出现垂直滚动条。
  • 将以下代码放入lvList.MouseDoubleClick事件中:

Debug.Print("双击发生了")

  • 运行应用程序
  • 双击滚动条的LargeChange区域(而不是滚动条本身)
  • 注意立即窗口打印ListView的双击发生消息

如何更改此行为,使得仅当鼠标“悬停”在ListViewItems上时才会发生MouseDoubleClick,而不是在不断单击ScrollViewer向下/向上滚动列表时发生?

4个回答

5

您无法更改行为,因为MouseDoubleClick处理程序已附加到ListView控件,因此无论何时单击ListView,它都必须发生 - 任何地方。您可以做的是检测ListView的哪个元素首先检测到双击,并从那里确定它是否是ListViewItem。这是一个简单的示例(省略错误检查):

private void lv_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
  DependencyObject src = (DependencyObject)(e.OriginalSource);
  while (!(src is Control))
    src = VisualTreeHelper.GetParent(src);
  Debug.WriteLine("*** Double clicked on a " + src.GetType().Name);
}

请注意使用e.OriginalSource找到实际被双击的元素。这通常是一些低级别的东西,比如矩形或文本块,因此我们使用VisualTreeHelper向上遍历到包含控件。在我简单的示例中,我假设我们遇到的第一个控件将是ListViewItem,但如果您正在处理包含文本框或复选框等内容的CellTemplates,则可能不是这种情况。但您可以轻松地细化测试,仅查找ListViewItems -- 但在这种情况下,请不要忘记处理点击位于任何ListViewItem之外且搜索最终命中ListView本身的情况。

这样就可以了。我只是加入了一个选择语句来过滤掉任何“滚动条”元素,然后就可以继续了。谢谢。 - ScottN

1

这可能有所帮助吗?

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

0
  <Style TargetType="{x:Type ListViewItem}">           
            <EventSetter Event="MouseDoubleClick" Handler="OnListViewDoubleClick" />
        </Style>

如果您使用此样式,它会起作用。只需双击列表视图中的项目即可。

此外,您必须从列表视图中删除双击操作。


0

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

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

这将处理 ListView 内部的任何子 ListViewItem 控件上的 MouseDoubleClick 事件。如果有效,请告诉我们!


2
我进行了快速测试,似乎仍会在ListView中的任何位置引发事件,而不仅仅是ListViewItems。 - itowlson
不妨一试。无论如何,我会在这里留下答案。 - Matt Hamilton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接