2014-11-27 11 views
2

Я разрабатываю приложение WPF для использования в точке продажи с сенсорным экраном. У меня есть элемент ItemsControl с кнопками продуктов внутри ScrollViewer. Пользователь может прокручивать (панорамировать) через продукты, перетаскивая их пальцем. Чтобы добавить продукт в корзину, пользователь просто касается кнопки продукта. Все идет нормально.Прокрутка прокрутки WPF ScrollViewer

Однако, поскольку поверхность сенсорного экрана довольно гладкая и полированная, пальчик пользователя иногда скользит маленьким битом при попытке нажимать кнопку. В этом случае кнопка не регистрируется. Вместо этого ScrollViewer прокручивает эту маленькую часть движения.

Теперь, мой вопрос: есть ли способ уменьшить чувствительность ScrollViewer, так что потребуется более длительное перетаскивание, чтобы инициировать прокрутку и подавление события click.

Благодарим за любые советы!

С наилучшими пожеланиями,

Chris

ответ

4

У меня была такая же проблема чувствительности, и решить это следующим образом:

создал собственный ScrollViewer, который наследует от родной ScrollViewer:

  1. Override метод OnManipulationDelta
  2. Убедитесь, что палец переместился достаточно (е .CumulativeManipulation.Translation.Y)
  3. Если нет, то не call base.OnManipulationDelta (e). В противном случае вызовите base.OnManipulationDelta (e)

Похоже, что встроенное управление панорамированием treshold немного равно 3 пикселам, и именно поэтому сенсорный клик легко регистрируется как панорамирование. Посредством этого трюка вы можете определить свою собственную сделку. Я использовал 35 пикселей (точнее, независимые от устройства пиксели в WPF)

+2

Я решил это с помощью свойства e.CumulativeManipulation.Translation.Length> 35. В этом случае длина - это дельта между началом и текущей позицией пальца. –

+0

Я, наконец, решил попробовать это решение. Это намного проще, чем другое, и работает так, как ожидалось. Благодаря! – Christophe

+0

Возможно, стоит отметить, что вы должны обернуть свой Translation.Y в Math.Abs, чтобы вы могли измерять его вверх или вниз: if (Math.Abs ​​(e.CumulativeManipulation.Translation.Y)> 35) – nixkuroi

0

Существует способ, который вы можете выполнить ваши требования, но я не уверен, что вам понравится ... Вы в основном должны реализовать свои собственную пользовательскую логику прокрутки с помощью IScrollInfo Interface. Вы можете сделать это, реализовав интерфейс IScrollInfo в пользовательском Panel и просто задерживая вызовы для прокрутки любой суммы, которая вам нравится.

Этот интерфейс имеет достаточно большое количество методов и свойств, которые необходимо реализовать, но они в основном довольно просто ... это небольшой пример, чтобы дать вам представление о том, как просто они:

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

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

Дополнительную помощь вы можете получить, просмотрев статью WPF Tutorial - Implementing IScrollInfo на веб-сайте Tech Pro.

После того, как у вас есть обычай Panel, который обеспечивает пользовательскую прокрутку, вам просто нужно использовать его в ScrollViewer, которые вы можете сделать в Resource:

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

Наконец, ссылки на ваш CustomScrollViewer в каком бы то ни контроле сбора которые вы решите использовать. Итак, это можно сделать, но можете ли вы беспокоиться об этом?

+0

Благодарим за предложение. Если ничего проще не придет, я сделаю это.Но я должен признать, что я надеялся на более легкое решение, такое как переопределение некоторого метода ScrollViewer. – Christophe

Смежные вопросы