2009-07-27 5 views
6

Zunächst ist das Mousewheel-Ereignis nicht in Visual Studio 2008 Ereignisfenster aufgeführt, die sehr ärgerlich ist.Kann MouseWheel-Ereignis in C# Windows Forms nicht auslösen

fand ich das richtige Format Online aber, und schrieb dies in meinen Code:

private void Form1_MouseWheel(object sender, MouseEventArgs e) 
    { 
     Debug.WriteLine("Foo"); 
    } 

... von denen ich erhalte keine Antwort, wenn das Mausrad gedreht wird.

Ich mache das in meinem Hauptbereich Klasse Code, und der Designer enthält nur das eine Formular/Fenster/was auch immer, so dass die Maus nicht den Fokus verliert.

namespace BlahBlah 
{ 
    public partial class Form1 : Form 
    { 

Und dagegen habe ich diese Methode direkt über das Mausrad ein und es funktioniert gut:

private void Form1_MouseClick(object sender, MouseEventArgs e) 
    { 
     Debug.WriteLine("Foo"); 
    } 

Wenn ich raten müsste, ich denke ich nicht den Code korrekt verknüpfen bin zu dem Formular (aka: all die Dinge, die Visual Studio für mich tun würde, wenn ich dieses Ereignis über das Ereignisfenster des Designers hinzufügen würde). Aber ich könnte mich irren oder nur einen dummen Fehler machen.

Können Sie mir helfen, IRGENDEINE Antwort zu erhalten, wenn das Mausrad gedreht wird? Vielen Dank!

Antwort

11

Das Mausrad-Ereignis muss eingerichtet werden.

Fügen Sie diese auf Form1 Konstruktor (Nach InitalizeComponents();)

this.MouseWheel+= new MouseEventHandler(Form1_MouseWheel); 
+0

Das war's, vielen Dank! Sidequestion: Ich habe auch eine für meine MouseMove-Methode (this.MouseMove + = Form1_MouseMove;), aber nicht für MouseClick. Warum braucht es keinen? – cksubs

+1

Nun ... reagiert es auf einen Mausklick? Wenn es nicht auf Mausklicks reagieren muss, wird es nicht benötigt. Einige Steuerelemente haben automatisch Mausklick-Ereignisse miteinander verknüpft (zum Scrollen und nicht so). Das hängt davon ab, was Sie erreichen möchten. – Kurisu

+0

Ich meine nur meine MouseClick-Methode funktioniert (feuert mit Mausklick) ohne die Notwendigkeit der ".... + = ...." Zeug im Konstruktor. Deshalb habe ich vergessen, so etwas für MouseWheel hinzuzufügen, MouseClick hat gut funktioniert. – cksubs

1

Ich weiß nicht, wie Sie dieses bestimmte Ereignis abonnieren, aber Sie können stattdessen die entsprechende Methode auf dem Formular überschreiben.

6

ich mit einem Kommentar nicht genug Ruf zu reagieren, aber die Antwort auf Ihre Seite Frage ist, dass die Delegierten brauchen eingerichtet sein. Wenn Sie jedoch einen Eintrag erstellen, indem Sie im Eigenschaftsbereich darauf doppelklicken, wird der Code automatisch generiert und in der InitializeComponent-Methode in der Datei * .designer.cs abgelegt.

+1

Ja, werfen Sie einen Blick in die Datei designer.cs und schauen Sie sich in den Regionen um, Sie werden sehen, wie der Code-Generator ein wenig gearbeitet hat, um diese Ereignisse für Sie zu verkabeln. –

1

In diesem Fall empfiehlt es sich, die Elementfunktion OnMouseWheel außer Kraft zu setzen, anstatt sich beim Ereignis zu registrieren. Zum Beispiel:

public class MyFrm : Form 
{ 
    protected override void OnMouseWheel(MouseEventArgs e) 
    { 
     /*Handle the mouse wheel here*/ 
     base.OnMouseWheel(e); 
    } 
} 
+0

Warum ist das besser? –

+1

@JonofAllTrades Es hat eine bessere Leistung und mehr Flexibilität (Sie können Ihre Arbeit vor einem der Teilnehmer ausführen, die das Ereignis abonniert haben). http://stackoverflow.com/questions/159317/when-should-you-override-onevent-asope-posed-abonnement-to-the-event-when-inh –