【问题标题】:WPF ScrollViewer scroll sensitivityWPF ScrollViewer 滚动灵敏度
【发布时间】:2015-01-26 06:16:06
【问题描述】:

我正在开发一个 WPF 应用程序,用于带有触摸屏的销售点。我在 ScrollViewer 中有一个带有产品按钮的 ItemsControl。用户可以通过用手指拖动来滚动(平移)产品。要将产品添加到购物车,用户只需触摸产品按钮。到目前为止一切顺利。

但是,由于触摸屏表面非常光滑和抛光,用户的手指在尝试按下按钮时有时会打滑。在这种情况下,未注册按钮单击。相反,ScrollViewer 会滚动那一点点移动。

现在,我的问题是:有没有办法降低 ScrollViewer 的灵敏度,以便启动滚动和抑制点击事件需要更长的拖动时间。

感谢您的建议!

最好的问候,

克里斯

【问题讨论】:

    标签: wpf button scroll scrollviewer


    【解决方案1】:

    有一种方法可以满足您的要求,但我不确定您是否会喜欢它...您基本上需要使用IScrollInfo Interface 实现您自己的自定义滚动逻辑。您可以通过在自定义 Panel 中实现 IScrollInfo 接口并简单地延迟调用以任意数量滚动来做到这一点。

    这个接口有很多你需要实现的方法和属性,但它们大多都非常简单......这是一个小例子,让你了解它们有多简单:

    public void LineDown()
    {
        SetVerticalOffset(VerticalOffset + LineSize); 
    }
    
    public void LineUp()
    {
        SetVerticalOffset(VerticalOffset - LineSize); 
    }
    

    您可以通过查看 Tech Pro 网站上的 WPF Tutorial - Implementing IScrollInfo 文章获得更多帮助。

    一旦您拥有提供自定义滚动的自定义Panel,您只需在ScrollViewer 中使用它,您可以在Resource 中执行此操作:

    <ScrollViewer x:Key="CustomScrollViewer">
        <YourXmlNamespacePrefix:YourCustomPanel>
            <ItemsPresenter ... />
        </YourXmlNamespacePrefix:YourCustomPanel>
    </ScrollViewer>
    

    最后,在您选择使用的任何集合控件中引用您的CustomScrollViewer。所以,是可以做到的,但是你能不能不做呢?

    【讨论】:

    • 感谢您的建议。如果没有更容易的事情发生,我会试一试。但我必须承认,我希望有一个更简单的解决方案,例如覆盖某些 ScrollViewer 方法。
    【解决方案2】:

    我有同样的敏感性问题,并以这种方式解决:

    创建了自己的ScrollViewer,继承自原生ScrollViewer:

    1. 覆盖 OnManipulationDelta 方法
    2. 检查手指是否移动了足够多 (e.CumulativeManipulation.Translation.Y)
    3. 如果没有,请调用 base.OnManipulationDelta(e)。否则,调用 base.OnManipulationDelta(e)

    本机控件平移阈值似乎只有 3 个像素,这就是为什么触摸单击很容易注册为平移的原因。通过这个技巧,您可以定义自己的门槛。我使用了 35 像素(确切地说,WPF 中与设备无关的像素)

    【讨论】:

    • 我用属性 e.CumulativeManipulation.Translation.Length > 35 解决了这个问题。在这种情况下,长度是手指的开始位置和当前位置之间的增量。
    • 我终于开始尝试这个解决方案了。它比另一个容易得多,并且按预期工作。谢谢!
    • 值得注意的是,您应该将 Translation.Y 包装在 Math.Abs​​ 中,以便您可以向上或向下测量它: if (Math.Abs​​(e.CumulativeManipulation.Translation.Y) > 35)
    【解决方案3】:

    我有同样的问题,我正在尝试实施可接受的解决方案(在列表框上)。 我遇到的问题是 OnManipulationDelta 永远不会被解雇。

    我这样做是否正确? (总 WPF 菜鸟)。

    公共类 MyListbox 继承 System.Windows.Controls.ListBox

    Shared Sub New()
        'This OverrideMetadata call tells the system that this element wants to provide a style that is different than its base class.
        'This style is defined in themes\generic.xaml
        DefaultStyleKeyProperty.OverrideMetadata(GetType(MyListbox), New FrameworkPropertyMetadata(GetType(MyListbox)))
    
    End Sub
    
    Protected Overrides Sub OnManipulationDelta(e As ManipulationDeltaEventArgs)
        Console.WriteLine("Detected" & e.CumulativeManipulation.Translation.Length)
    
        If e.CumulativeManipulation.Translation.Length > 35 Then
            MyBase.OnManipulationDelta(e)
        Else
            e.Handled = True
        End If
    End Sub
    

    结束类

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多