【问题标题】:How to detect double click on list view scroll bar?如何检测列表视图滚动条上的双击?
【发布时间】:2017-11-22 18:08:29
【问题描述】:

我有两个关于 WPF 的列表视图。第一个列表视图加载了一个数据表。当从第一个列表视图中双击一个项目时,selectedItem 将移动到第二个列表视图。

由于从 DataTable 加载了很多元素,在第一个列表视图中出现滚动条时会出现问题。如果选择一个项目并双击滚动条向下箭头,则会启动 MouseDoubleClick 事件并将所选项目移动到第二个列表视图。

如何检测滚动条上的双击以防止这种情况发生?

非常感谢!

【问题讨论】:

    标签: wpf listview scrollbar double-click


    【解决方案1】:

    我测试了上面非常有用的代码,但发现以下代码更稳定,因为有时源会被报告为 GridViewRowPresenter,而实际上你是在双击一个项目。

    var src = VisualTreeHelper.GetParent((DependencyObject)e.OriginalSource);
    var srcType = src.GetType();
    if (srcType == typeof(ListViewItem) || srcType == typeof(GridViewRowPresenter))
    {
        // Your logic here
    }
    

    【讨论】:

      【解决方案2】:

      在第一个 Listview 上的 MouseDoubleClick 事件中试试这个:

      DependencyObject src = VisualTreeHelper.GetParent((DependencyObject)e.OriginalSource);
      
      if(src is Control && src.GetType() == typeof(ListViewItem))
      {
          // Your logic here
      }
      

      基于this

      我在各种项目中使用它,它解决了您面临的问题。

      【讨论】:

      • 这很好用。只有您有时必须这样做DependencyObject src = (DependencyObject)(e.OriginalSource); while (!(src is Control)) { src = VisualTreeHelper.GetParent(src); } 才能获得适当的控制
      【解决方案3】:
      private void ListBox_OnMouseDoubleClick(object pSender, MouseButtonEventArgs pE)
      {
        FrameworkElement originalSource = pE.OriginalSource as FrameworkElement;
        FrameworkElement source = pE.Source as FrameworkElement;
      
        if (originalSource.DataContext != source.DataContext)
        {
            logic here
        }         
      }
      

      当您拥有 DataContext 时,您可以轻松查看发件人是项目还是主列表框

      【讨论】:

      • OP 已经 4 岁了。您的问题是否添加了涉及软件更新/升级的其他信息,如果是,请说明以避免误解。
      【解决方案4】:

      我已经有了最终的解决方案:

      private void ListView_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
      {
          var originalSource = (DependencyObject)e.OriginalSource;
          while ((originalSource != null) && !(originalSource is ListViewItem)) originalSource = VisualTreeHelper.GetParent(originalSource);
          if (originalSource == null) return;
      }
      

      它对我有用。

      【讨论】:

        猜你喜欢
        • 2017-10-25
        • 2023-03-06
        • 2011-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多