2016-05-03 101 views
0

我對鼠標滾輪事件有一個相當大的問題。我試圖找到任何類型的引用,但總是找到關於此問題的不同主題的答案。我爲整個表單做了一個鼠標滾輪事件(這也是全屏的,但它應該可以工作,不管鼠標在哪裏) - MouseWheel+=ChangeLength;(或MouseWheel += new MouseEventHandler(ChangeLength);,沒關係)並且在第一行放置一個斷點它,只是爲了看看它是否有效。C#winforms- MouseWheel事件不會因爲控件屬性而觸發

它沒有。

我打開了一個空白項目來測試它,出人意料的是,它做到了!然後我尋找問題的根源,發現設計師只有兩條線路才能成功解決事件,而不是解決問題。這兩條線were-

this.rater.TabIndex = 15; 
this.rater.Visible = false; 

如果這些線都是未加註釋,滾動鼠標滾輪,當什麼都沒有發生,但如果兩人都刪除或評論,它的工作就好了。使用Focus(),單擊屏幕,更改設計器外的屬性和其他已知方法並沒有幫助。

我需要補充的是rater不是只是一個常規的控制,這可能是這個奇怪的問題的來源。這是一個名爲ShapeRater的自定義控件。我真的不明白爲什麼以及如何導致它的性能,它們完全不相關!另外,我刪除了其中一個評估者(這導致了問題),因爲另一個很好,但是一旦被刪除,以前的確定者就開始引發這個問題。

有沒有人知道爲什麼會發生這種情況,以及如何解決它?


非常感謝先進的和抱歉,如果我沒有寫得夠準確。這是我在這個網站上的第一個問題。

回答

0

可能當你讓它看不見時,你正在將焦點轉移到其他控件上(因爲當控件消失時,你的控件失去焦點並且焦點轉移到別的地方)。獲得焦點的特定控件也將依賴於標籤索引值,因爲它會像下一個或上一個控件那樣。

請注意,使用自定義控件時,鼠標點擊不會自動獲得焦點。例如,您需要在MouseDown事件中撥打Focus()電話。

除此之外,爲了通過將鼠標移動到其上來控制增益鼠標滾輪事件,您必須在MouseEnter中關注焦點。像MouseEnter += (s, e) => Focus();。但我不確定這是否是一個完美的解決方案,因爲我認爲只需將鼠標移到其他控件上,就可以「竊取」其他控件的焦點。

你可以做的另一件我認爲更好的事情就是處理窗體上每個控件的MouseWheel事件,然後在響應之前檢查鼠標是否在你的區域內。

例:

HandleCreated += (s, e) => { 
    var maybeForm = FindForm(); 
    if (maybeForm == null) 
     return; // or throw since you should have a form by now 
    var form = maybeForm; 

    MouseEventHandler mouseScrollDelegate = (s, e) => MouseScroll(e.Delta); 
    foreach (var control in form.Controls.Cast<Control>()) 
     control.MouseWheel += mouseScrollDelegate; 
}; 

... 

void MouseScroll(int pDelta) { 
    var screenMouse = Cursor.Position; 
    var clientMouse = PointToClient(screenMouse); 
    if (!ClientRectangle.Contains(clientMouse)) 
     return; 

    // do something 
}