[英]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.