2016-08-17 4 views
1

Ich habe eine Windows Forms-Anwendung erstellt, aber ich bekomme merkwürdiges Verhalten von der Capture-Eigenschaft eines Steuerelements.Control.Capture ist immer wahr?

in einer leeren Form, mit einem einzigen Label namens „label1“ und der Code

public Form1() 
{ 
    InitializeComponent(); 

    label1.MouseDown += pictureBox1_MouseDown; 
} 

void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    Debug.WriteLine(label1.Capture); 
    label1.Capture = !label1.Capture; 
    Debug.WriteLine(label1.Capture); 
} 

ich beobachtet, dass die erste Console.WriteLine „True“ immer sagt, sagt der zweite immer „False“, wenn die Schaltfläche wird angeklickt. Auch wenn mehrfach geklickt wird.

Das Etikett reagiert nie auf Klicks außerhalb seines Rahmens, auch wenn ich stattdessen label1.Capture = true verwende.

Missverstehe ich das erwartete Verhalten der "Capture" -Eigenschaft? Ich habe erwartet, dass der Anfangswert falsch ist und das Label nicht auf Klicks außerhalb reagiert, nach dem ersten Klick erwarte ich, dass der Wert wahr ist, und das Label reagiert auf alle Mausklicks, auch außerhalb seiner Grenzen.

+0

Die Verwendung desselben Ereignishandlers für zwei Steuerelemente kann zu Verwirrung führen. Sie erhalten True, wenn Sie auf das Label klicken. Und sicher, False, wenn Sie auf die PictureBox klicken. Winforms verwendet die Capture-Eigenschaft, um das Click-Ereignis zuverlässig zu generieren und es vor dem Auslösen des MouseDown-Ereignisses einzuschalten. Dies ist erforderlich, damit das Click-Ereignis * nicht * ausgelöst wird, wenn Sie die Maustaste loslassen, nachdem Sie es außerhalb der Grenzen des Steuerelements gezogen haben. Die Verwendung der Capture-Eigenschaft selbst (wie in "Reagieren auf Klicks außerhalb") funktioniert wahrscheinlich nicht. –

Antwort

1

In einem MouseDown Ereignis wird die Capture für die Steuerung zunächst immer auf true festgelegt. Also normalerweise, wenn Sie eine MouseDown ausführen und dann, ohne die Maustaste loszulassen, bewegen Sie Ihre Maus aus der Steuerung und lassen Sie dann die Maustaste los, wird das MouseUp Ereignis des Steuerelements ausgelöst.

Wenn Sie Capture-false in MouseDown gesetzt, dann der Mausereignis Ihrer Kontrolle funktioniert nur Feuer, wenn Sie die Maus über die Steuerung ist und wenn Sie die Maus aus Ihrer Kontrolle bewegen und dann Maustaste loslassen, das MouseUp Ereignis deiner Kontrolle wird nicht erhöhen.

Auch in MouseUp wird die Erfassung automatisch freigegeben.

Weitere Informationen einen Blick auf diese Ressourcen nehmen:

+0

Danke. Ich komme aus WPF, wo dies anders gehandhabt wird. – Jens