您可以这样做的一种方法是绑定到MouseDown和MouseUp事件。使用类似于在MouseDown上开始的秒表,并检查在MouseUp上过去的时间量。如果它少于3秒,请执行Click()操作。如果超过3秒,请执行LongClick()操作。
private void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
stopwatch = new Stopwatch();
stopwatch.Start();
}
private void Button_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
stopwatch.Stop();
if (stopwatch.ElapsedMilliseconds >= 3000)
{
// do Click()
}
else
{
// do LongClick
}
}
下面是对的RepeatButton一个解决方案:
private bool isLongClick;
private bool hasAlreadyLongClicked;
private void RepeatButton_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
isLongClick = false;
hasAlreadyLongClicked = false;
stopwatch = new Stopwatch();
stopwatch.Start();
}
private void RepeatButton_Click(object sender, RoutedEventArgs e)
{
if (!hasAlreadyLongClicked && stopwatch.ElapsedMilliseconds >= 3000)
{
hasAlreadyLongClicked = true;
isLongClick = true;
// do your LongClick action
}
}
private void RepeatButton_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
if (!isLongClick)
{
// do short click action
}
}
这里的技巧是一个的RepeatButton基本上只是一个按钮,点击触发在每一个时间间隔。因此,如果我们在按钮的PreviewMouseDown上启动Stopwatch,则每次Click事件触发时,我们都可以检查秒表上已经过的时间,并根据结果修改我们的操作。
LongClick事件不应该等到我释放鼠标,但实际上是三秒钟过后。但这将是一个有趣的(简单而有效的)解决方案。要试一试。 – heltonbiker 2014-10-31 20:20:58
@heltonbiker嗯。这比RepeatButton的功能更接近按钮。我会看看我能否拿出这样的东西。 – furkle 2014-10-31 20:22:36
是的,我当前的小工具是repeatbuttons,因为这是他们模拟的硬件行为。我的问题的核心是“如何区分第一次点击和后续点击?” – heltonbiker 2014-10-31 20:23:56