【问题标题】:Handling Button gesture for both single and double click/tap处理单击/双击的按钮手势
【发布时间】:2017-08-12 05:20:30
【问题描述】:

在 Xamarin 表单中:我希望能够同时检测单击/点击和双击/点击,并能够执行不同的操作。

也就是说,当按钮被点击时我要执行actionA,而当按钮被双击时我要执行actionB,并且只有actionB

【问题讨论】:

标签: event-handling xamarin.forms double-click


【解决方案1】:

你需要一个实际的按钮吗?否则请查看TapGestureRecognizer。在this post 中描述了如何使用它。您几乎可以将其应用于任何控件。

例如,如果您将Label 设置为看起来像一个按钮,您将在其上添加一个双击识别器,如下所示:

<Label Text="Tap me, I double dare you">
    <Label.GestureRecognizers>
        <TapGestureRecognizer
                Tapped="OnTapGestureRecognizerTapped"
                NumberOfTapsRequired="2" />
  </Label.GestureRecognizers>
</Label>

当然,您需要在您的代码中包含一个名为OnTapGestureRecognizerTapped 的事件。但由于NumberOfTapsRequired 属性中的值,您需要双击才能激活它。

如果您更喜欢代码,这将是对应的:

var tapGestureRecognizer = new TapGestureRecognizer();
tapGestureRecognizer.NumberOfTapsRequired = 2;
tapGestureRecognizer.Tapped += (s, e) => {
    // handle the tap
};
label.GestureRecognizers.Add(tapGestureRecognizer);

【讨论】:

  • 这很有用,但我忘了提到我希望将 Tap 和 DoubleTap 事件连接到同一个按钮。使用您的解决方案,我只能连接 DoubleTap。
  • 更明确地说:当我同时连接 Tap 和 DoubleTap 时使用您的解决方案,Tap 会干扰 DoubleTap(因为 Tap 总是在 DoubleTap 之前发生)。
  • 我必须说这听起来有点违反直觉,但如果这确实是你想要的,你应该实现某种延迟机制。当单击发生时,稍微查看一下是否发生了双击,然后取消单击。
  • 我使用 javascript 执行此操作,使用窗口超时在很短的时间间隔内等待第二次点击:如果在间隔期间发生第二次点击,则执行 DoubleTap,否则执行 Tap。我的猜测是 NumberOfTapsRequired="2" 的 TapGestureRecognizer 是这样工作的,除了它会吞下单击。我不太清楚如何在 Xamarin Forms 中达到同样的效果。
【解决方案2】:

这是我最终做的事情(感谢 Amit Patil):

    private static int clickCount;
    private static object _sender;

    private void Button_Clicked(object sender, EventArgs e)
    {
        if (clickCount < 1)
        {
            TimeSpan tt = new TimeSpan(0, 0, 0, 0, 250);
            _sender = sender;
            Device.StartTimer(tt, ClickHandle);
        }
        clickCount++;
    }

    bool ClickHandle()
    {
        if (clickCount > 1)
        {
            Minus1(_sender);
        }
        else
        {
            Plus1(_sender);
        }
        clickCount = 0;
        _sender = null;
        return false;
    }

【讨论】:

    【解决方案3】:

    ViewModel.cs:

    private bool _isClicked = true;
    public bool IsClicked
    {
      get { return _isClicked = true; }
      set { _isClicked = true = value; OnPropertyChanged(); }
    }
    

    View.xaml:

    <Button Text="Click!" IsEnabled="{Binding IsClicked}" />
    

    方法(在 ViewModel.cs 中):

    public void MyMethod()
    {
      IsClicked = false;
        
      // Your code
      IsClicked = true;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-15
      • 2016-04-05
      • 2012-05-18
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多