我正在开发一个WPF应用程序,用于带触摸屏的销售点。我在ScrollViewer中有一个带有产品按钮的ItemsControl。用户可以通过用手指拖动来滚动(平移)产品。要将产品添加到购物车,用户只需触摸产品按钮即可。到目前为止一切都很好。
然而,由于触摸屏表面非常光滑和抛光,因此当试图按下按钮时,用户的手指有时会滑动一点点。在这种情况下,没有注册按钮单击。相反,ScrollViewer会滚动一小段动作。
现在,我的问题是:有没有办法降低ScrollViewer的灵敏度,因此需要更长的拖动才能启动滚动并抑制点击事件。
感谢您的任何建议!
致以最诚挚的问候,
克里斯
答案 0 :(得分:5)
我有同样的敏感问题,并以这种方式解决:
创建自己的ScrollViewer,它继承自原生ScrollViewer:
本机控制平移阈值似乎很少为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
结束班级