【问题标题】:How can I prevent touch-click when touch-scrolling?触摸滚动时如何防止触摸单击?
【发布时间】:2019-08-28 20:39:32
【问题描述】:

我有一个 ItemsControl,它用一个 ScrollViewer 包装它的 ItemPresenter。该 ItemPresenter 显示一个 ListView。因此我在一个集合中有一个集合。

现在,我只希望 ScrollViewer 具有滚动功能,因此我继续从内部 ListView 中删除了滚动功能。

问题是我的滚动事件被 ListView 搞砸了。只要我的手指触摸内容区域,它就会选择 ListViewItems 而不是滚动。

如果用户尝试单击或滚动,我如何通过路由事件来判断?如果是滚动,如何防止它选择 ListViewItems?

<ItemsControl ItemsSource="{Binding Countries}" >
   <ItemsControl.Template>
      <ControlTemplate>
         <ScrollViewer PanningMode="VerticalOnly">
            <ItemsPresenter/>
         </ScrollViewer>
      </ControlTemplate>
   </ItemsControl.Template>

   <ItemsControl.ItemTemplate>
      <DataTemplate>
         <ListView ItemsSource="{Binding Cities}">
            <ListView.Template>
               <ControlTemplate>
                  <ItemsPresenter/>
               </ControlTemplate>
             </ListView.Template>
         </ListView>
      </DataTemplate>
   </ItemsControl.ItemTemplate>
</ItemsControl>

【问题讨论】:

    标签: c# .net wpf xaml routed-events


    【解决方案1】:

    没有任何方法可以展望未来,看看用户是在触摸屏幕后开始滚动还是在之后立即松开手指。不过,Future API 会很好。

    无论如何,您可以检查一下用户在触摸 ListView 后是否移动了手指。如果是这样,通过手动滚动 ScrollViewer 并取消选择 ListView 项,开始将“触摸”视为“滚动”而不是“点击”。

    类似这样的:

    private bool _touchDown = false;
    private double _initOffset = 0;
    private double _scrollDelta = 5;
    
    private void ListView_PreviewTouchDown(object sender, TouchEventArgs e) 
    {
        _touchDown = true;
        _initOffset = e.GetTouchPoint(this).Y;
    }
    
    private void ListView_PreviewTouchMove(object sender, TouchEventArgs e) 
    {
        if (_touchDown && Math.Abs(r.GetTouchpoint(this).Y - _initOffset) > _scrollDelta) 
        {
            My_ScrollViewer.ScrollToVerticalOffset(r.GetTouchpoint(this).Y - _initOffset);
            My_ListView.UnselectAll();
        }
    }
    
    private void ListView_PreviewTouchUp(object sender, TouchEventArgs e) 
    {
        _touchDown = false;
        _initOffset = 0;
    }
    

    免责声明:我只是在记事本中写的。它有问题,但它传达了这个概念。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2011-09-15
      • 2011-10-27
      • 2014-04-13
      • 1970-01-01
      • 2013-06-08
      相关资源
      最近更新 更多