在WinRT-XAML中,Click、Tapped和PointerPressed这三个词是同义词吗?

38

我应该为PointerPressed、Click或Tapped创建事件处理程序吗?换句话说,以下代码之间是否有任何功能上的区别:

<Button x:Name="BackButton" PointerPressed="BackButton_Click"/>    
<Button x:Name="BackButton" Click="BackButton_Click"/>    
<Button x:Name="BackButton" Tapped="BackButton_Click"/>

?


2
Click和Tapped之间的一个重要区别是,如果控件的Manipulation事件被触发,Click将会被触发,但Tapped不会。例如,如果您拖动一个按钮来移动它,按钮将移动并在Manipulation Completed时触发Click事件,但不会触发Tapped事件,因为Tapped只有在没有拖动的情况下才会触发。 - Sameh
1
我注意到另一个不同之处是,当与按钮一起使用时,键事件Enter和Space会路由到Clicked处理程序,但不会路由到Tapped。默认情况下,甚至KeyUp/KeyDown处理程序也不会处理Enter和Space! - Shahin Dohan
4个回答

58

Click是为了向后兼容,基本上与Tapped相同。 Tapped是一个“高级手势”,将自动转换为单击、轻按、笔按等操作,并且是我建议使用的操作。

PointerPressed不是你想要的操作。原因如下:如果我按住不放,PointerPressed事件会在我最初“按下”时触发,然后在完成后触发PointerReleased事件。这更低级别,您可以决定它被按下了多长时间等。通常,长按不是您想要考虑的“单击”或“轻按”,因为按定义Tap持续时间更短。因此,对于您想要的内容,“Tap”最好传达,因为它使用系统计时来转换手势,以确定什么是“Tap”和什么是按住,并自动将点击和笔按升级到同一事件。无论交互持续多长时间,PointerPressed都会在按钮被按下或手指被按下时触发。

我有一个非常复杂的应用程序,演示了各种交互,您可以从http://windows8applications.codeplex.com下载 - 只需参考名为“Touch”的第4章样本即可。


8
我喜欢将其称为:
  1. 点按是新的点击
  2. PointerPressed 是新的 MouseDown
  3. PointerReleased 是新的 MouseUp
- Flatliner DOA
3
根据this thread中描述的问题,我建议 Click 可能不仅适用于向后兼容。 - Filip Skakun
为什么我无法在UWP中使PointerPressed正常工作?它只会在右键单击时触发。当我左键单击按钮时,什么也不会发生。 - Shimmy Weitzhandler
2
不完全是这样。正如@jeremy-likness所说,“Click”并不是为了向后兼容而存在的。它与“Tapped”相比远非等效。如果这是一个“Button”控件,您应该每次都处理“Click”并忽略“Tapped”。如果您正在处理特殊用例的触摸手势,则“Tapped”变得非常重要。再次重申,“Tapped”不是@flatliner-doa所说的新“Click”。(在“Button”控件上)“Click”没有改变。 - Jerry Nixon

27

杰里米的回答并不完全准确。在另一个帖子中,有人报告说当快速点击/触摸时,敲击事件与单击事件不同,存在问题,以下代码可以很容易地重现此问题,而且可以轻松扩展到指针事件。

public sealed partial class MainPage : Page
{
    private int clicks = 0;
    private int taps = 0;
    public MainPage()
    {
        this.InitializeComponent();
        var button = new Button();
        button.Width = 500;
        button.Height = 200;
        button.Content = string.Format("Clicks: {0}, Taps: {1}", clicks, taps);
        button.Click += (s, e) => button.Content = string.Format("Clicks: {0}, Taps: {1}", ++clicks, taps);
        button.Tapped += (s, e) => button.Content = string.Format("Clicks: {0}, Taps: {1}", clicks, ++taps);
        this.Content = button;
    }
}

Click是正常按钮上应该处理的内容。它具有预期的按钮逻辑,我能想到的其中一些事情包括:

  • 它可以使用键盘和鼠标工作
  • 即使您按下按钮并缓慢释放它,它也能工作
  • 如果您通过从按钮处拖动取消按下,也可以通过将其拖回来恢复之前按下按钮来使用它
  • 它每次仅限于一个按钮,因此如果您尝试同时点击两个按钮,则首先触摸的那个不会被单击(与支持多用户交互的原始Surface/PixelSense不同!)
  • 它可能与自动化等功能以及Windows的辅助功能更好地配合使用
  • 它总是有效的

如示例代码所示-如果您重复点击,则Tapped事件不会记录所有点击。我不确定这是否是因为某些底层手势识别逻辑看到了某些双击或仅出于其他原因而拒绝了每次点击的原因。它适用于快速单点触碰/笔触或鼠标点击,但它是一个通用事件,您可以在任何UIElement上处理它,并且可能用于区分在任意UI元素上的单击、双击、右击(!)或保持。

指针事件是较低级别的,您可以使用它们来处理框架中尚未构建的略微更高级的交互。正如我之前提到的-单击包括在按钮上同时发生的按下和释放,因此类似的交互可以用指针事件来模拟。例如,您可以将其用于实现某种同步点击多个UI元素的Whac-A-Mole / Twister组合游戏,在这种情况下,您无法使用单击。


2
是的,Click不是为了向后兼容而存在的。Click存在是因为它是一个按钮。Tapped存在是因为可能有一个触摸手势需要处理。按钮将Tapped转发到Click的事实是对开发人员的一种恩惠。它远非相同。 - Jerry Nixon

7

对于按钮(以及ListView、超链接、MenuFlyoutItem、ContentDialog等),您应该使用Click事件。Tapped只是一个指针事件,因此如果您使用键盘、访问键或自动化,则不会触发它。


3
我知道这是一个老话题,但获胜答案并不正确,当它说ClickTapped本质上是相同的。它们不是相同的。如果您需要在控件中进行快速点击,则Tapped的响应速度不如Click
在非常特定的场景中,例如在自定义数字键盘中,如果用户想要输入像“11”这样的值(两次点击相同的按钮),当您使用Tapped时,通常会错过第二个字符,因此您只能得到“1”,而不是“11”。使用Click则不会发生这种情况。
附:我正在使用UWP。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接