WPF ListView ScrollViewer双击事件

时间:2010-03-20 22:47:33

标签: wpf listview scrollviewer double-click

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

  • 新WPF项目
  • 添加ListView
  • 将listview命名为:x:Name =“lvList”
  • 将足够的ListViewItem添加到ListView以完全填充列表,以便在运行时显示垂直滚动条。
  • 将此代码放入lvList.MouseDoubleClick事件

Debug.Print(“双击发生”)

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

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

4 个答案:

答案 0 :(得分: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查找双击的实际元素。这通常是一个非常低级的东西,如Rectangle或TextBlock,所以我们使用VisualTreeHelper走向包含控件。在我琐碎的例子中,我假设我们击中的第一个控件将是ListViewItem,如果您正在处理包含例如CellTemplates的CellTemplates,则可能不是这种情况。文本框或复选框。但是您可以轻松地优化测试以仅查看ListViewItems - 但在这种情况下,不要忘记处理单击在任何ListViewItem之外的情况,并且搜索最终会击中ListView本身。

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

如果您应用此样式,则可以使用。只需双击列表视图中的项目即可。

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