2010-09-27 2 views
1

Я разрабатываю клиентский киоск WPF, который будет развернут на машине HP TouchSmart Windows 7 с поддержкой multi-touch. Моя проблема заключается в том, что при использовании multi-touch в Windows 7 приложение не распознает «нажатие» пальца в качестве события нажатия кнопки, поэтому кнопка «Триггер» для изменения цвета никогда не запускается.Кнопка WPF нажимает на Windows 7 mulit-touch

Анимация Windows 7 для касания обычно отображается, и событие нажатия кнопки срабатывает нормально. Только стиль XAML определяет, что событие IsPressed не работает по назначению с помощью пальцевого крана. В конце концов, он работает, если при нажатии пальцем и/или вы катитесь или нажимаете так, как будто вы делаете это для отпечатка пальца. Есть ли обходной путь для того, чтобы сделать «нажмите» огонь нажатием/кликом?

<Trigger Property="AreAnyTouchesOver" Value="true"> 
    <Trigger.ExitActions> 
     <BeginStoryboard Storyboard="{StaticResource PressedOff}" /> 
    </Trigger.ExitActions> 
    <Trigger.EnterActions> 
     <BeginStoryboard Storyboard="{StaticResource PressedOn}" /> 
    </Trigger.EnterActions> 
</Trigger> 

<Trigger Property="AreAnyTouchesDirectlyOver" Value="true"> 
    <Trigger.ExitActions> 
     <BeginStoryboard Storyboard="{StaticResource PressedOff}" /> 
    </Trigger.ExitActions> 
    <Trigger.EnterActions> 
     <BeginStoryboard Storyboard="{StaticResource PressedOn}" /> 
    </Trigger.EnterActions> 
</Trigger> 
+0

На данный момент мы решили отказаться от глазной конфеты, чтобы отпустить выпуск, возможно, у меня будет время вернуться к ней позже. –

ответ

5

Я не понимаю, что вы хотите сделать.

Некоторые пояснения по вашему вопросу:

В сенсорной IsPressed только срабатывает, когда ваш контакт удерживается над элементом и порог движения передается для создания «нажмите» (Вот почему вы видите его, если вам нажмите пальцем вниз и слегка сдвиньте его)

Как только контакт наступает, IsPressed = false.

Когда вы нажимаете кнопку, вы по существу делаете щелчок мышью. Вот почему события срабатывают, как ожидалось.

Итак, что именно вы пытаетесь сделать? Вы хотите запустить анимацию раскадровки, когда кнопка «удерживается» («IsPressed») или когда нажата кнопка (нажата).

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

Я думаю, что самый простой ответ за то, что вы хотите, - это триггер на «TouchDown», если я правильно понимаю ваши вопросы.

UPDATE:

Это должно работать для триггера TouchDown

<Button Content="Touch Down Example" Height="20" Width="20"> 
     <Button.Triggers> 
      <EventTrigger RoutedEvent="Button.TouchDown"> 
       <BeginStoryboard> 
        .... 
       </BeginStoryboard> 
      </EventTrigger> 
     </Button.Triggers> 
    </Button> 

ПРИМЕЧАНИЕ: Я не имеют сенсорный экран передо мной, так что может быть ошибки, но это выглядит правильно.

+0

Извините за то, что я не знаю. Мне трудно общаться с тем, что я хочу. Вы правы, я хочу, чтобы Trigger на «TouchDown», как мне это сделать? Некоторые предпосылки: клиент киоска разрабатывается на стандартном экране Gvision Touch (без мультитач) - поэтому touch/press/click работает одинаково. Приложение развертывается на ПК с поддержкой multi-touch, поэтому мои проблемы с передачей. Надеюсь, это поможет. –

+0

Обновлен мой ответ, чтобы включить пример –

+0

Пробовал ваше решение, я все еще не вижу ожидаемого результата. Мне интересно, интерпретирует ли Windows 7 случайный прикосновение. Также попробовали предложение от http://connect.microsoft.com/VisualStudio/feedback/details/527886/touchdown-does-not-trigger-until-the-touch-moves –

2

Для разработки сенсорных приложений я бы рекомендовал использовать проект Microsoft® Surface® Toolkit for Windows Touch Beta в вашем проекте и использовать входящие в комплект элементы управления на поверхности, поскольку они правильно обрабатывают события касания и множество вариантов использования, таких как пользователь, нажимая кнопку с двумя пальцами, и поднимать их по одному. Только последний «подъем» или событие TouchUp должны вызывать событие Click.

Все элементы управления поверхностью являются подклассами элементов управления Windows, поэтому подклассы SurfaceListBox ListBox, подклассы SurfaceButton Button и т. Д. Таким образом, все ваши стили и шаблоны будут по-прежнему работать с этими элементами управления.

В вашем случае вы захотите использовать элемент управления SurfaceButton.Просто добавьте ссылку на инструментарий сборок, и в вашем внешнем элементе (,, и т.д.), добавить ссылку на поверхности пространства имен, таких, как

xmlns:s="http://schemas.microsoft.com/surface/2008" 

, а затем добавить элементы управления поверхности из этого пространства имен, таких, как

<s:SurfaceButton x:Name="button1" Click="OnButtonClick" /> 
+0

Согласитесь полностью. Однако, если проблема, которую видит автор, связана с тем, что поставщик сенсорного экрана неправильно поддерживает Windows 7 Touch API (как кажется, может быть, так), то Surface Toolkit не поможет. Независимо от того, если бета-версия программного обеспечения является вариантом для этого проекта, то, безусловно, используйте Surface Toolkit –

+0

@Foovanadil - пропустил этот комментарий, когда вы впервые разместили его, извините. Причина, по которой я упоминал это явно, заключается в том, что я сейчас работаю с устройством в линейке продуктов HP Touchsmart, и это также стало причиной моей проблемы. Необработанные события касания * должны * быть продвинуты на события мыши, но на самом деле многие вещи могут проглотить эти события без дальнейшего уведомления. – Hugo

+0

Спасибо Хьюго, я попробую API поверхности, когда у меня будет шанс. Пока мы вернулись к сенсорному экрану с поддержкой multi-touch. –

4

Просто установите Stylus.IsPressAndHoldEnabled прилагаемое имущество на False для кнопки. Это приведет к тому, что свойство кнопки IsPressed будет установлено/очищено в ответ на касание, а также щелчок мышью.

Из документации для UIElement.TouchDown Event:

Чтобы вызвать PreviewTouchDown и приземление событие происходит, как только палец касается экрана, установите Stylus.IsPressAndHoldEnabled вложенное свойство к ложному для этого элемента.

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

<Setter Property="Stylus.IsPressAndHoldEnabled" Value="False"/> 

Я нашел этот вопрос, пытаясь найти способ сделать мою кнопку надежно анимация для щелчков мыши и событий касания. Принятый ответ послал мне то, что кажется неправильным путем: Синхронизация раскадровки с событиями касания вверх/вниз. Использование триггера свойств IsPressed для обоих оказалось простым и надежным. Надеюсь, это спасет кого-то другого от подобной ошибки.

+0

Можете ли вы связать меня с чем-то, что объясняет, как статическое свойство, подобное этому, может быть установлено в значение только для одного конкретного элемента? Почему это не было бы глобальным изменением? –

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