2011-03-10 20 views
2

我在我的WPF应用程序中有一个列表框,当用户双击一个项目时,我更改列表的内容(如目录导航)。在某些情况下,双击是有意义的,然后立即再次双击,因为您知道同一位置会出现什么情况。你会希望你可以通过快速连续点击四次来完成这个任务(这应该意味着“两次双击”)。我怎样才能重复双击没有WPF改变一些三击?

但这并不奏效。如果您点击足够快的速度,直到WPF发送另一个双击事件之前的第五次或第六次点击!

它看起来像WPF内置支持三击,有时甚至更多,如果你点击足够快。我跑了一个简单的例子来证实这一点:

<ListBox PreviewMouseLeftButtonDown="ListBox_PreviewMouseLeftButtonDown"/> 

private void ListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    Trace.WriteLine("ClickCount = " + e.ClickCount); 
} 

当我运行它,点击速射,我得到这样的输出:

ClickCount = 1 
ClickCount = 2 
ClickCount = 3 
ClickCount = 1 
ClickCount = 2 
ClickCount = 3 
ClickCount = 4 
ClickCount = 1 
ClickCount = 2 
ClickCount = 3 

有时它计算到3,然后复位;有时它在复位之前计数到4。我无法达到它的最大值5.

但后来我进入控制面板>鼠标,并将双击速度更改为最慢的设置。然后,我可以可靠地将它重新计数到10,如果我真的预订它,可以达到11或12。所以显然这是关于在您的系统配置的“双击”间隔之前您可以多快点击一下。如果您在该时间间隔过去之前多次点击,则会获得“三击”或“四击”或更多。

但我不想想要三击或四击 - 特别是如果他们不可能通过某些双击配置获得。我希望其他每次点击都是双击事件(只要它们连续快速移动,鼠标未超过阈值等)

有没有什么办法可以获得WPF当我点击快速消息时,为我提供正常的双击事件(每隔一次点击事件)?

+0

由于您设法计算点击次数,为什么不在'ClickCount%2 == 0'时做任何您需要做的事情? – madd0 2011-03-10 00:29:23

+0

@ madd0,再看看我发布的输出。 ClickCount不会增加。考虑到上面的示例输出,您将对第2次,第5次,第7次和第10次点击作出回应。偶尔它会得到理想的行为,但只是偶然。 – 2011-03-10 13:44:27

回答

0

ClickCount显示用户点击系统双击时间多少次。所以,如果你只需要在双击回应:

private void ListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    if (e.ClickCount % 2 == 1) 
     return; 
    Trace.WriteLine(e.ClickCount + " " + DateTime.Now); 
} 

输出:

//2 clicks: 
2 10.03.2011 16:05:17 
//4 clicks: 
2 10.03.2011 16:05:20 
4 10.03.2011 16:05:20 
//3 clicks: 
2 10.03.2011 16:05:26 
+0

你的第一句话解释了为什么你的代码*不能工作。*再看一下我发布的示例输出,以及ClickCount实际返回的内容。您的代码会对第2次,第5次,第7次和第10次点击做出回应。我希望能够对第2,4,6,8和10次点击做出回应。 – 2011-03-10 13:47:37

+0

尝试另一种方式。请检查新代码。 – 2011-03-10 14:07:18

+0

'ClickCount%2 == 1'对于第一次点击将是真实的,而对于第二次点击则不是 - 所以,不。再次,阅读你自己的答案的第一句话,看看为什么这不起作用。迟早,你只会在系统双击时间内获得3次点击,然后ClickCount将不再在奇数和偶数之间进行严格的交替(它将是1,2,3,1)。据我所知,任何依赖于ClickCount的注定会失败。 – 2011-03-11 14:58:05

1

使用几个实例变量:_LastMouseDownTime和_LastMouseDownWasDoubleClick:

private int _LastMouseDownTime; 
    private bool _LastMouseDownWasDoubleClick; 

    private void ListBox_PreviewMouseDown(object sender, MouseButtonEventArgs e) { 
     if(e.Timestamp - _LastMouseDownTime <= System.Windows.Forms.SystemInformation.DoubleClickTime && !_LastMouseDownWasDoubleClick) { 
      Debug.Print("DoubleClick - StupidWorthlessClickCount:{0}", e.ClickCount); 
      _LastMouseDownWasDoubleClick = true; 

      //Do some double clicking goodness 
     } else { 
      Debug.Print("FirstClick - StupidWorthlessClickCount:{0}", e.ClickCount); 
      _LastMouseDownWasDoubleClick = false; 

      //Do some single clicking goodness 
     } 
     _LastMouseDownTime = e.Timestamp; 
     base.OnMouseDown(e); 
    } 

我知道这是超级黑客和不太灵活,但它应该得到你所需要的。我试图让WPF RichTextBox响应那些第四,第五等点击,就像他们是第一,第二等,使选择工作更自然,但这可能证明是不可能的! :)

希望这会有所帮助。