2016-05-03 19 views
0

Ich habe ein Problem mit dem Mausrad Ereignis. Ich habe versucht, irgendwelche Verweise darauf zu finden, fand aber immer Antworten zu verschiedenen Themen in dieser Angelegenheit. Ich habe ein Mausrad Ereignis für das gesamte Formular gemacht (das ist auch Vollbild, aber es sollte unabhängig davon funktionieren, wo die Maus ist) MouseWheel+=ChangeLength; (oder MouseWheel += new MouseEventHandler(ChangeLength);, ist es egal) und setzen Sie einen Haltepunkt in der ersten Zeile von es, nur um zu sehen, ob es funktioniert.C# winforms- MouseWheel Ereignis nicht wegen der Steuereigenschaften feuern

Es tat es nicht.

Ich öffnete ein leeres Projekt, um es zu testen und überraschenderweise tat es! Ich suchte dann nach der Ursache des Problems und fand heraus, dass nur zwei Linien im Designer den Unterschied ausmachen, ob das Ereignis erfolgreich ausgelöst wurde und überhaupt nicht. Die beiden Linien Wer-

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

Wenn eine dieser Linien unkommentiert waren, nichts passiert, wenn das Mausrad scrollen, aber wenn beide wurden gelöscht oder kommentiert, es funktionierte gut. Unter Verwendung von Focus(), Klicken auf den Bildschirm, das Ändern der Eigenschaften außerhalb des Designers und anderer bekannter Methoden hat nicht geholfen.

Ich muss hinzufügen, dass rater ist nicht nur eine regelmäßige Kontrolle, und dies ist wahrscheinlich die Quelle für dieses seltsame Problem. Es ist ein benutzerdefiniertes Steuerelement namens ShapeRater. Ich verstehe wirklich nicht, warum und wie die Visible und TabIndex Eigenschaften dazu führen, dass sie völlig unabhängig sind! Außerdem löschte ich einen der Bewerter (was das Problem verursachte), weil das andere gut war, aber sobald es gelöscht wurde, fing das vorher OK an, dieses stattdessen zu verursachen.

Hat jemand eine Idee, warum das passiert und wie es zu beheben?


Vielen Dank im Voraus und tut mir leid, wenn ich nicht genau genug geschrieben habe. Dies ist meine erste Frage auf dieser Seite.

Antwort

0

Wahrscheinlich, wenn Sie es nicht sichtbar machen, schieben Sie den Fokus auf eine andere Steuerung (weil Ihre Steuerung den Fokus verliert und der Fokus woanders hingeht, wenn die Steuerung verschwindet). Das jeweilige Steuerelement, das den Fokus erhält, hängt auch von den Werten des Registerindex ab, da es sich um das nächste oder vorherige Steuerelement handelt, auf das es ausgerichtet ist.

Beachten Sie, dass bei einem benutzerdefinierten Steuerelement der Fokus nicht automatisch durch Mausklicks erzielt wird. So müssen Sie zum Beispiel einen Focus() Anruf in Ihrem MouseDown Ereignis haben.

Darüber hinaus, um eine Kontrolle Mausrad Ereignisse nur durch Bewegen der Maus darüber zu gewinnen, müssen Sie den Fokus in MouseEnter nehmen. So etwas wie MouseEnter += (s, e) => Focus();. Ich bin mir nicht sicher, ob das eine perfekte Lösung ist, da ich denke, dass Sie den Fokus von einer anderen Steuerung "stehlen" werden, indem Sie einfach die Maus darüber bewegen. Ein anderes Ding, das Sie tun können, von dem ich denke, dass es viel besser ist, behandeln einfach das MouseWheel Ereignis jedes Steuerelements auf dem Formular und dann überprüfen Sie einfach, ob die Maus tatsächlich in Ihrem Bereich ist oder nicht, bevor Sie darauf reagieren.

Ex:

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 
}