【问题标题】:WPF ListView ScrollViewer Double-Click EventWPF ListView ScrollViewer 双击事件
【发布时间】:2010-03-20 22:47:33
【问题描述】:

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

  • 新建 WPF 项目
  • 添加列表视图
  • 为列表视图命名:x:Name="lvList"
  • 向 ListView 添加足够的 ListViewItem 以完全填满列表,以便在运行时出现垂直滚动条。
  • 将此代码放入 lvList.MouseDoubleClick 事件中

Debug.Print("双击发生")

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

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

【问题讨论】:

    标签: wpf listview scrollviewer double-click


    【解决方案1】:

    您无法更改该行为,因为 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,如果您正在处理包含例如文本框或复选框。但是您可以轻松地改进测试以仅查找 ListViewItems —— 但在这种情况下,不要忘记处理点击在任何 ListViewItem 之外的情况,并且搜索最终会命中 ListView 本身。

    【讨论】:

    • 做到了。我只是加入了一个选择案例来过滤掉任何“滚动条”元素,我很高兴。谢谢。
    【解决方案2】:

    也许这有帮助?

    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
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 我对此进行了快速测试,它似乎仍然会为 ListView 中的任何位置引发事件,而不仅仅是 ListViewItems。
      • 我想值得一试。无论如何,我都会在这里留下答案。
      【解决方案4】:
        <Style TargetType="{x:Type ListViewItem}">           
                  <EventSetter Event="MouseDoubleClick" Handler="OnListViewDoubleClick" />
              </Style>
      

      如果你应用这种风格,它会起作用。只需双击列表视图中的项目即可。

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

      【讨论】:

        猜你喜欢
        • 2021-04-21
        • 2011-03-23
        • 2020-10-23
        • 2010-10-18
        • 1970-01-01
        • 2010-11-05
        • 2023-03-19
        • 1970-01-01
        • 2011-04-26
        相关资源
        最近更新 更多