繁体   English   中英

单击 5 次时如何触发事件?

[英]How to trigger an event when something is clicked 5 times?

我知道这可能是一个简单答案的愚蠢问题,但我无法弄清楚。 当 label 被按下 5 次时,我试图触发一个事件。 我怎么能 go 关于这样做?

首先,我们不知道你使用什么标签——Windows Forms、Web Forms、WPF? 例如,如果您使用 Web 表单,这与回发等完全不同。WPF 也是完全不同的“动物”。

因此,如果这是一个 windows 窗体标签或其他控件,只需声明一个类变量/成员并在单击 5 次时执行某些操作,然后将其重置

public class Clickable 
{
    private int _counter = 0;


    private void SomeControl_Click(object sender, EventArgs e)
    {
        _counter++;
        if (_counter == 5)
        {
            // DO SOMETHING HERE
            MySpecialMethod();
            // And then reset counter so you can click 5 times again
            _counter = 0;
        }
    }

}

我知道这已经解决了,但我最近想做同样的事情,我想分享我的实现。

我想要的是:当用户在 2 秒内点击 5 次时做一些事情

这是我的助手 class ClickStreakMachine.cs

using System;

namespace MyApp01;

/// <summary>
/// A helper class that invokes an action when the Click method is triggered enough times within a certain time window
/// </summary>
public class ClickStreakMachine
{
    private readonly int _requiredClicks;
    private readonly TimeSpan _maxClickSpacing;
    private readonly Action _action;

    private DateTime _lastClickedAt = DateTime.MinValue;
    private int _clickStreak = 0;

    /// <summary>
    /// A helper class that invokes an action when the Click method is triggered enough times within a certain time window
    /// </summary>
    /// <param name="requiredClicks">Clicks required to trigger the action</param>
    /// <param name="maxClickSpacing">Max distance between clicks</param>
    /// <param name="action">Action to trigger when conditions are met</param>
    public ClickStreakMachine(int requiredClicks, TimeSpan maxClickSpacing, Action action)
    {
        _requiredClicks = requiredClicks;
        _maxClickSpacing = maxClickSpacing;
        _action = action;
    }

    public void Click()
    {
        var now = DateTime.Now;

        if (_clickStreak == 0)
        {
            //first click
            _clickStreak++;
            _lastClickedAt = now;
            return;
        }

        //reset if clicked too late
        if (now - _lastClickedAt > _maxClickSpacing)
        {
            _clickStreak = 1;
            _lastClickedAt = now;
            return;
        }

        //add
        _clickStreak++;
        _lastClickedAt = now;

        //invoke action and reset streak if enough clicks
        if (_clickStreak >= _requiredClicks)
        {
            _action?.Invoke();
            _clickStreak = 0;
        }
    }
}

我像这样使用它:

using System.Windows.Controls;

namespace MyApp01;

public partial class MainWindow : Window 
{
    public MainWindow()
    {
        //setup the click streak machine so the user has to click 5 times (each click within 400ms of the last one) to trigger the DoSomething method
        var clickStreakMachine = new ClickStreakMachine(5, TimeSpan.FromMilliseconds(400), () => DoSomething());

        var label = new Label();
        label.MouseLeftButtonDown += clickStreakMachine.Click();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM