Como combinar manipuladores de eventos de toque e mouse sem produzir comportamento duplicado?
Estou trabalhando em um aplicativo WPF que está sendo usado em um tablet com tela de toque. Desenvolvo usando o IDE VS2015 e uso o Mouse para depurar.
Eu devo lidar com botões 'down
eup
eventos para executar determinadas tarefas. eu usoPreviewMouse
ePreviewTouch
manipuladores de eventos e eu tenho um problema em todos os casos que eu uso:
Caso 1: UsandoPreviewMouseDown
,PreviewMouseUp
,PreviewTouchDown
ePreviewTouchUp
. Para cada botão, preciso duplicar meu código para incluir manipuladores de eventos de toque e mouse separadosmas exatamente a mesma funcionalidade. Faço isso para poder usar o Aplicativo (Mouse) e para o usuário usá-lo (Toque).Problema: Touch Event Handlers executa Mouse Event Handlers; Fazendo com que o aplicativo duplique o comportamento. Ex: um botão que incrementax
por um, será incrementado por um se você "clicar" nele, mas incrementado por dois se você "tocar" nele.
Caso 2: UsandoClick
, PreviewMouseUp
ePreviewTouchUp
. Problema: oPreviewTouchUp
ePreviewMouseUp
não seja chamadoClique do mouse.
Caso 3: Crie um método para cada botão e chame-o de eventos do Touch e Mouse, comoComo obter a tela sensível ao toque para usar os eventos do mouse. Problema: Comportamento duplicado (o método é chamado duas vezes)
Caso 4: Remova todos os eventos do Touch desdePreviewMouseDown
ePreviewMouseUp
estão sendo executados em qualquer Touch. O comportamento funciona, mas preciso tocar em determinadas posições do botão para que ele seja executado. (Transparência? Preciso tocar exatamente em uma posição - como um mouse?)
Caso 5: UsandoMouseUp
eMouseDown
ao invés dePreview
. Não funcionou no Touch, tocando em qualquer posição do botão.
Eu quero algo parecido com issoImpedir que um aplicativo WPF interprete eventos de toque como eventos do mouse mas apenas no tablet. Ainda preciso usar o mouse no meu ambiente. Como posso consertar isso?
Exemplo de botão XAML:
<Button x:Name="locationScrollUpButton" Margin="0,5,5,0" Background="Transparent" Padding="0" Grid.Row="1" Grid.Column="1" PreviewMouseUp="locationScrollUpButton_PreviewMouseUp" PreviewMouseDown="locationScrollUpButton_PreviewMouseDown" BorderThickness="0" PreviewTouchDown="locationScrollUpButton_PreviewTouchDown" PreviewTouchUp="locationScrollUpButton_PreviewTouchUp" >
<StackPanel>
<TextBlock x:Name="locationUpButtonText" Text="Up" FontSize="13" Margin="0,2,0,4" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<Image x:Name="locationUpButtonImage" Source="/ProjectName;component/Resources/CaptureView/Location-Scroll-Up-White.png" Width="55" Height="60"/>
</StackPanel>
</Button>