2011-06-02 11 views
0

我的UserControl是一種內部具有一組控件的容器。我設計的UI行爲之一是,通過嵌套控件的移動使其選擇用於某些鍵盤觸發的操作。使用箭頭鍵移動下方控件的內容時啓動的MouseMove事件問題

設置旨在接收鍵盤輸入的嵌套控件的另一種方法是使用箭頭鍵將焦點更改爲我的UserControl中的某個控件。

問題是,在大多數情況下,我的UserControl有滾動條,並且使用箭頭鍵在其元素之間切換會導致內容移動。由於這種運動,似乎mousemove事件也在鼠標箭頭靜止不動時啓動,但它在我的用戶控件上。最後,選擇了錯誤的嵌套控件。

我試圖設置一個布爾標誌來臨時鎖定mousemove事件的動作,而箭頭鍵處理函數啓動時,但它似乎根本不工作。

有沒有人有一個想法如何防止不必要的mousemove事件觸發,並避免它造成的問題?

+0

看起來好像你試圖強加一個不同的焦點模型到內置到窗口中的模型(即你似乎想要「將控件集中在鼠標光標下」)。是否有理由如此糟糕地打破常規用戶的期望?另外,雖然鼠標沒有物理移動,但它在邏輯上具有 - 它現在位於控件的不同部分,因此鼠標移動事件當然會發生。 – 2011-06-02 07:08:47

+0

@ damien-the-unbeliever哦,事實上,當光標超過特定控件時,控件的移動導致鼠標事件並不奇怪。問題是我如何可以避免/臨時禁用事件啓動的有效方式或檢測這種鼠標移動的情況並防止代碼執行。鼠標移動不會導致焦點!,只是選擇不可見的方式控制某些動作,箭頭鍵也會導致選擇和移動容器控件的內容滾動到新選擇的控件,如果它看不見,我用focus()實現它。以這種方式設計,我堅持spec.as儘可能。 – MoreThanChaos 2011-06-03 09:54:00

回答

0

我做了一些調試/實驗,看來,雖然鼠標停留仍超過控制研究的的MouseMove實際上是頻繁調用,而不是隻在控制舉動被一些UI行爲引起(父母控制研究的滾動使用鍵盤調用)。

似乎它每秒調用兩次(但可能只有在調試會話期間以VS方式啓動應用程序時),調用間隔幾百秒才能確定是什麼原因。

解決方案(也許不止,而不是最好的)是存儲光標的最後位置,並將其與內部事件,以檢查是否鼠標真的從去年的MouseMove調用移動。我使用System.Windows.Forms.Cursor.Position來實現它,因爲從MouseEventArgs的位置將根據情況而不同,但仍然不確定鼠標光標是否被移動。

Point lastCursorPosition = new Point(); 

    private void panelPictures_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (System.Windows.Forms.Cursor.Position != lastCursorPosition) 
     { 
      Console.WriteLine("mouse moved"); 
      lastCursorPosition = System.Windows.Forms.Cursor.Position; 
     } 
     else 
     { 
      Console.WriteLine("mouse in place"); 
     } 
    }