控件上的鼠标按下时间最短
Having minimum mousedown time on control
我有一个控件(基本上是一个 ON/OFF 拨动开关),我希望用户在切换状态之前至少按下它一秒钟。我可以测量控件上鼠标按下和鼠标松开事件之间的时间,并确保鼠标在按下时永远不会离开控件,但我想知道:
是否有更好的方法来确定该控件上的 "click" 满足最短时间?
没有更简单的方法,您必须执行您描述的步骤。
但是,这个 "behavior" 可以用通用的方式实现 - 所以它可以重复使用多次。
以下是此类实现的示例:
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!");
}
还有其他实现变体,其中之一是覆盖控件 class(它比这个更简单)。
我有一个控件(基本上是一个 ON/OFF 拨动开关),我希望用户在切换状态之前至少按下它一秒钟。我可以测量控件上鼠标按下和鼠标松开事件之间的时间,并确保鼠标在按下时永远不会离开控件,但我想知道:
是否有更好的方法来确定该控件上的 "click" 满足最短时间?
没有更简单的方法,您必须执行您描述的步骤。
但是,这个 "behavior" 可以用通用的方式实现 - 所以它可以重复使用多次。
以下是此类实现的示例:
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!");
}
还有其他实现变体,其中之一是覆盖控件 class(它比这个更简单)。