2011-03-10 46 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響應那些第四,第五等點擊,就像他們是第一,第二等,使選擇工作更自然,但這可能證明是不可能的! :)

希望這會有所幫助。