Handling Button gesture for both single and double

2019-06-02 20:53发布

问题:

In Xamarin Forms: I want to be able to detect both click/tap and double-click/tap, and to be able to perform different actions.

That is, when the button is clicked I want to perform actionA, and when the button is double-clicked I want to perform actionB, and only actionB.

回答1:

Do you need an actual button? Else look at the TapGestureRecognizer. In this post is described how you can use it. You can apply it to virtually any control.

For example if you would style a Label to look like a button, you would add a double tap recognizer on it like this:

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

Of course you need to have an event called OnTapGestureRecognizerTapped in your code behind. But because of the value in the NumberOfTapsRequired property, you will need a double tap to activate it.

If you prefer code, this would be the counterpart:

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


回答2:

Here's what I ended up doing (kudos to 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;
    }