如何组合触摸和鼠标事件处理程序而不会产生重复行为?

时间:2016-05-17 18:04:53

标签: c# wpf touch

我正在研究正在触摸屏平板电脑上使用的WPF应用程序。我使用VS2015 IDE进行开发,并使用鼠标进行调试。

我必须处理按钮'downup事件才能执行某些任务。我使用PreviewMousePreviewTouch事件处理程序,我在每种情况下都遇到问题:

  • 案例1 :使用PreviewMouseDownPreviewMouseUpPreviewTouchDownPreviewTouchUp。对于每个按钮,我需要复制我的代码以包含单独的触摸和鼠标事件处理程序完全相同的功能。我这样做是为了能够使用应用程序(鼠标)和用户使用它(触摸)。 问题:触摸事件处理程序执行鼠标事件处理程序;导致应用程序复制行为。例如:将x递增1的按钮,如果您“点击”它会增加1,如果您“触摸”它会增加2。

  • 案例2 :使用ClickPreviewMouseUpPreviewTouchUp问题: 鼠标点击时未调用PreviewTouchUpPreviewMouseUp

  • 案例3 :为每个按钮创建一个方法,并通过触摸和鼠标事件(如How to get Touchscreen to use Mouse Events)调用它。 问题:重复行为(方法被调用两次)

  • 案例4 :删除所有Touch事件,因为PreviewMouseDownPreviewMouseUp正在任何Touch上执行。行为有效但我需要触摸按钮上的某些位置才能执行。 (透明度?我必须触及一个位置 - 就像鼠标一样?)

  • 案例5 :使用MouseUpMouseDown代替Preview。完全无法触摸Touch,触摸按钮上的任何位置。

我想要与此Prevent a WPF application to interpret touch events as mouse events类似的东西,但仅限于平板电脑。我仍然需要在我的环境中使用鼠标。我该如何解决这个问题?

按钮示例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>

2 个答案:

答案 0 :(得分:4)

检查MouseEventArgs的StylusDevice属性。如果为null,则鼠标事件不是提升的触摸事件。如果它不是null,那么StylusDevice将成为触发设备,它启动了提升的触摸。

答案 1 :(得分:3)

所以我最终使用酷酷的黑客来做这件事。根据艾哈迈德对另一个问题HERE的回答,我们知道处理程序的消防顺序:

触控设备:

  

TouchDown&gt; PreviewMouseDown&gt; TouchUp&gt; PreviewMouseUp

On Non Touch:

  

PreviewMouseDown&gt; PreviewMouseUp

基于@ M.Kazem的评论。修复现在看起来像这样:

private bool ButtonPreview = true;
private void Button_TouchDown(object sender, TouchEventArgs e)
{
    // task 1
    ButtonPreview = false;
}
private void Button_TouchUp(object sender, TouchEventArgs e)
{
    // task 2
    // ..
}
private void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    if (ButtonXPreview)
    {
        // task 1
    }
    else
        ButtonXPreview = true;

}
private void Button_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
    if (ButtonXPreview)
    {
        // task 2
    }
    else
        ButtonXPreview = true;
}