Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在控件上具有最小的鼠标下降时间_C#_Mousedown - Fatal编程技术网

C# 在控件上具有最小的鼠标下降时间

C# 在控件上具有最小的鼠标下降时间,c#,mousedown,C#,Mousedown,我有一个控件(基本上是一个开/关切换开关),我希望用户在切换状态之前至少按下一秒钟。我可以测量控件上鼠标按下和鼠标上升事件之间的时间,并确保鼠标在按下时不会离开控件,但我想知道: 是否有更好的方法来确定控件上的“单击”满足最短时间?没有更简单的方法,您必须执行所述步骤 但是,这种“行为”可以以一种通用的方式实现——因此可以多次重用 以下是此类实施的一个示例: public class LongClick { public static void Attach(Control Contro

我有一个控件(基本上是一个开/关切换开关),我希望用户在切换状态之前至少按下一秒钟。我可以测量控件上鼠标按下和鼠标上升事件之间的时间,并确保鼠标在按下时不会离开控件,但我想知道:


是否有更好的方法来确定控件上的“单击”满足最短时间?

没有更简单的方法,您必须执行所述步骤

但是,这种“行为”可以以一种通用的方式实现——因此可以多次重用

以下是此类实施的一个示例:

public class LongClick
{
    public static void Attach(Control Control, EventHandler Handler)
    {
        var LC = new LongClick { Control = Control, Handler = Handler };
        Control.MouseDown += LC.ControlOnMouseDown;
        Control.MouseMove += LC.ControlOnMouseMove;
        Control.MouseUp += LC.ControlOnMouseUp;
    }

    private Control Control;
    public EventHandler Handler;
    private DateTime? MDS;

    private void ControlOnMouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left) MDS = DateTime.Now;
    }
    private void ControlOnMouseMove(object sender, MouseEventArgs e)
    {
        if (MDS == null) return;
        if (e.X < 0) MDS = null;
        if (e.X > Control.Width) MDS = null;
        if (e.Y < 0) MDS = null;
        if (e.Y > Control.Height) MDS = null;
    }
    private void ControlOnMouseUp(object sender, MouseEventArgs e)
    {
        if (MDS == null) return;
        if (e.Button != MouseButtons.Left) return;
        var TimePassed = DateTime.Now.Subtract(MDS.Value);
        MDS = null;
        if (TimePassed.TotalSeconds < 1) return;
        if (Handler == null) return;
        Handler(Control, EventArgs.Empty);
    }
}

该实现还有其他变体,其中之一是重写控制类(它甚至比这个更简单)。

我认为您的解决方案是合理的。我不认为有任何内在的机制。
private void Form1_Load(object sender, EventArgs e)
{
    LongClick.Attach(button1, button1_LongClick);
}

private void button1_LongClick(object sender, EventArgs e)
{
    MessageBox.Show("button1 long clicked!");
}