2010-03-20 87 views
4

做下面将重现我的问题:WPF的ListView ScrollViewer中双击事件

  • 新的WPF项目
  • 添加的ListView
  • 名称列表视图:X:NAME = “lvList”
  • 添加足够的ListViewItems到ListView完全填充列表,以便在运行时出现垂直滚动条。
  • 将这个代码在lvList.MouseDoubleClick事件

Debug.Print( “双击发生”)

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

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

回答

4

由于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包含例如,则可能不是这种情况。文本框或复选框。但是,您可以轻松地完善测试以仅查看ListViewItems - 但在这种情况下,请不要忘记处理这种情况,点击位于任何ListViewItem之外,并且搜索最终会碰到ListView本身。

+0

这样做了。我只是抛出一个选择案例来过滤掉任何“滚动条”元素,我很乐意去。谢谢。 – ScottN 2010-03-21 01:01:58

0

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

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

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

+2

我给了这个快速测试,它似乎仍然在ListView中的任何地方引发事件,而不仅仅是ListViewItems。 – itowlson 2010-03-20 23:26:59

+0

值得一试我猜。无论如何,我都会在这里留下答案。 – 2010-03-21 05:00:59

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> 

如果应用这种风格,它的工作原理。只需双击列表视图中的项目将工作。

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