Нажмите кнопку WPF на Windows 7 мультитач - PullRequest
2 голосов
/ 28 сентября 2010

Я разрабатываю клиент, похожий на киоск WPF, который будет развернут на компьютере HP TouchSmart с Windows 7 с поддержкой multi-touch. Моя проблема в том, что в Windows 7 Multi-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>

Ответы [ 3 ]

5 голосов
/ 19 сентября 2013

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

Из документации на событие UIElement.TouchDown :

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

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

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

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

5 голосов
/ 28 сентября 2010

Мне не ясно, что ты хочешь сделать.

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

При касании 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>

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

2 голосов
/ 30 сентября 2010

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

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

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

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

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

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