这个问题已经存在了一段时间,可能会从一个简单的方法中受益。您可以通过测量 MouseDown 事件和 Click 事件(在 MouseUp 之前触发)之间的时间来模拟“点击并按住”(或单击并按住)。如果时间大于某个值,则取消 Click 并(可能)触发您自己的 TapAndHold 事件。我创建了一个测试控件,任何人都可以使用它来尝试这种方法。只需将 UserControl 添加到您的测试应用程序(我称为我的 TestTapAndHold),然后粘贴以下内容:
public partial class TestTapAndHold : UserControl
{
private string showText = "Tap Me";
private DateTime mouseDown;
private const int holdTime = 500;
public TestTapAndHold()
{
InitializeComponent();
this.Paint += drawText;
}
public delegate void OnTapAndHold(EventArgs e);
public event OnTapAndHold TapAndHold;
private void drawText(object sender, PaintEventArgs e)
{
using (var drawBrush = new SolidBrush(Color.Black))
{
e.Graphics.DrawString(showText, Font, drawBrush, new Point(5,3));
}
}
protected override void OnClick(EventArgs e)
{
if (DateTime.Now.Subtract(mouseDown).Milliseconds >= holdTime)
{
showText = "Tap Hold";
TapAndHold?.Invoke(e);
} else
{
base.OnClick(e);
showText = "Tapped";
}
Invalidate();
}
private void TestTapAndHold_MouseDown(object sender, MouseEventArgs e)
{
mouseDown = DateTime.Now;
}
}
构建应用程序,然后将其中一个测试控件弹出到表单上。然后,您可以将事件处理程序添加到您的表单中,例如:
private void testTapAndHold1_TapAndHold(EventArgs e)
{
MessageBox.Show("You tapped and Held");
}
这种通用方法使我能够将“点击并按住”功能添加到在 Microsoft Surface 4 上运行的 Windows 窗体应用程序中