WPF ScrollViewer滚动灵敏度

时间:2014-11-27 15:36:06

标签: wpf button scroll scrollviewer

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

然而,由于触摸屏表面非常光滑和抛光,因此当试图按下按钮时,用户的手指有时会滑动一点点。在这种情况下,没有注册按钮单击。相反,ScrollViewer会滚动一小段动作。

现在,我的问题是:有没有办法降低ScrollViewer的灵敏度,因此需要更长的拖动才能启动滚动并抑制点击事件。

感谢您的任何建议!

致以最诚挚的问候,

克里斯

3 个答案:

答案 0 :(得分:5)

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

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

  1. 覆盖OnManipulationDelta方法
  2. 检查手指是否已移动(e.CumulativeManipulation.Translation.Y)
  3. 如果没有,请调用base.OnManipulationDelta(e)。否则,请致电base.OnManipulationDelta(e)
  4. 本机控制平移阈值似乎很少为3像素,这就是为什么触摸点击很容易注册为平移。通过这个技巧,您可以定义自己的阈值。我使用了35像素(准确地说,WPF中与设备无关的像素)

答案 1 :(得分:0)

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

这个界面有很多方法和属性需要实现,但它们大多非常简单......这是一个小例子,让你知道它们有多简单:

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

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

通过查看Tech Pro网站上的IScrollInfo Interface文章,您可以获得进一步的帮助。

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

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

最后,在您选择使用的任何集合控件中引用您的CustomScrollViewer。所以,它可以做到,但是你可能会为此烦恼吗?

答案 2 :(得分:0)

我遇到了同样的问题,并且正在尝试实施已接受的解决方案(在列表框中)。 我的问题是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

结束班级