この質問はしばらく前から出回っており、単純なアプローチが役立つ可能性があります。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;
}
}
アプリをビルドし、テスト コントロールの 1 つをフォームにポップします。次に、次のようにフォームにイベント ハンドラーを追加できます。
private void testTapAndHold1_TapAndHold(EventArgs e)
{
MessageBox.Show("You tapped and Held");
}
この一般的なアプローチにより、Microsoft Surface 4 で実行されている Windows フォーム アプリに「タップ アンド ホールド」機能を追加することができました。