Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort zur 6. Auflage
1 Allgemeine Einführung in .NET
2 Grundlagen der Sprache C#
3 Das Klassendesign
4 Vererbung, Polymorphie und Interfaces
5 Delegates und Ereignisse
6 Strukturen und Enumerationen
7 Fehlerbehandlung und Debugging
8 Auflistungsklassen (Collections)
9 Generics – Generische Datentypen
10 Weitere C#-Sprachfeatures
11 LINQ
12 Arbeiten mit Dateien und Streams
13 Binäre Serialisierung
14 XML
15 Multithreading und die Task Parallel Library (TPL)
16 Einige wichtige .NET-Klassen
17 Projektmanagement und Visual Studio 2012
18 Einführung in die WPF und XAML
19 WPF-Layout-Container
20 Fenster in der WPF
21 WPF-Steuerelemente
22 Elementbindungen
23 Konzepte von WPF
24 Datenbindung
25 Weitere Möglichkeiten der Datenbindung
26 Dependency Properties
27 Ereignisse in der WPF
28 WPF-Commands
29 Benutzerdefinierte Controls
30 2D-Grafik
31 ADO.NET – Verbindungsorientierte Objekte
32 ADO.NET – Das Command-Objekt
33 ADO.NET – Der SqlDataAdapter
34 ADO.NET – Daten im lokalen Speicher
35 ADO.NET – Aktualisieren der Datenbank
36 Stark typisierte DataSets
37 Einführung in das ADO.NET Entity Framework
38 Datenabfragen des Entity Data Models (EDM)
39 Entitätsaktualisierung und Zustandsverwaltung
40 Konflikte behandeln
41 Plain Old CLR Objects (POCOs)
Stichwort

Download:
- Beispiele, ca. 62,4 MB

Buch bestellen
Ihre Meinung?

Spacer
Visual C# 2012 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2012

Visual C# 2012
Rheinwerk Computing
1402 S., 6., aktualisierte und erweiterte Auflage 2013, geb., mit DVD
49,90 Euro, ISBN 978-3-8362-1997-6
Pfeil 27 Ereignisse in der WPF
Pfeil 27.1 Ereignishandler bereitstellen
Pfeil 27.2 Routing-Strategien
Pfeil 27.2.1 Der durchlaufene Elementbaum
Pfeil 27.2.2 Beispielanwendung
Pfeil 27.2.3 Sonderfall der Mausereignisse
Pfeil 27.3 Der Ereignishandler
Pfeil 27.3.1 Die Klasse »RoutedEventArgs«
Pfeil 27.3.2 Die Quelle des Routing-Prozesses
Pfeil 27.3.3 Die Eigenschaft »Handled«
Pfeil 27.3.4 Registrieren und Deregistrieren eines Ereignishandlers mit Code
Pfeil 27.4 Definition eines Routed Events
Pfeil 27.4.1 Ereignisauslösung
Pfeil 27.4.2 Das Ereignis als Attached Event verwenden
Pfeil 27.4.3 Unterdrückte Ereignisse
Pfeil 27.5 Mausereignisse in der WPF
Pfeil 27.5.1 Ziehen der Maus
Pfeil 27.5.2 Auswerten der Mausklicks
Pfeil 27.5.3 Capturing

Galileo Computing - Zum Seitenanfang

27.5 Mausereignisse in der WPFZur nächsten Überschrift

Bis hierher haben wir uns die WPF-typischen Routed Events im Detail angesehen und gelernt, wie sie innerhalb der Architektur der WPF arbeiten. Natürlich werden viele Ereignisse bereits von der WPF angeboten. Exemplarisch wollen wir daraus eine Gruppe herausgreifen, nämlich die Mausereignisse.

Es gibt zahlreiche Ereignisse, die im Zusammenhang mit einer Mausaktion ausgelöst werden: MouseLeftButtonDown, MouseRightButtonDown, MouseDoubleClick, MouseWheel usw. Die aufgeführten Events sind gebubbelte Events, zu denen sich auch noch die entsprechenden getunnelten gesellen.


Galileo Computing - Zum Seitenanfang

27.5.1 Ziehen der MausZur nächsten ÜberschriftZur vorigen Überschrift

Lassen Sie uns ein wenig über die Mausereignisse sprechen, die im Zusammenhang mit der Bewegung der Maus über eine Komponente stehen:

  • MouseEnter
  • PreviewMouseMove / MouseMove
  • MouseLeave

MouseEnter und MouseLeave sind direkte Ereignisse. Dabei wird MouseEnter ausgelöst, wenn der Mauszeiger in den Bereich einer Komponente eindringt, MouseLeave, wenn der Mauszeiger den Bereich der Komponente verlässt.

Im Gegensatz zu MouseEnter und MouseLeave hat die Bewegung des Mauszeigers über eine Komponente zwei Ereignisse zur Folge: PreviewMouseMove ist der getunnelte Event, MouseMove der gebubbelte.

Alle genannten Mausereignisse haben eines gemeinsam: Sie übergeben dem Ereignishandler ein MouseEventArgs-Objekt, das mit zahlreichen Informationen aufwartet. Die wichtigsten können Sie Tabelle 27.3 entnehmen.

Tabelle 27.3 Die Member der Klasse »MouseEventArgs« (Auszug)

Eigenschaft/Methode Beschreibung

Device

Ruft das Eingabegerät ab (der Auslöser muss nicht zwangsläufig eine Maus sein, es kann sich auch um die Tastatur handeln oder einen Touchscreen).

Handled

Beschreibt einen booleschen Wert. Ist dieser auf true festgelegt,
gilt das Ereignis als behandelt.

LeftButton

MiddleButton

RightButton

Ruft den Zustand der entsprechenden Maustaste ab.

Etwas ungewöhnlich für ein EventArgs-Objekt ist, dass mit GetPosition eine Methode bereitgestellt wird. Diese liefert uns die aktuellen Mauskoordinaten relativ zu dem Objekt, das der Methode als Argument übergeben wird. Der Rückgabewert der Methode ist eine Point-Instanz, die mit den Eigenschaften X und Y die Koordinatenwerte bezogen auf das im Argument genannte Objekt liefert.

Im folgenden Codeschnipsel wird gezeigt, wie die Koordinatenwerte bezogen auf das Window in der Titelleiste des Fensters angezeigt werden können, falls die linke Maustaste beim Ziehvorgang gedrückt ist. Der Koordinatenursprung einer grafischen Komponente ist dabei in der linken oberen Ecke der Bezugskomponente.

private void window_MouseMove(object sender, MouseEventArgs e) {
if (e.LeftButton == MouseButtonState.Pressed) {
Point pt = e.GetPosition(this);
Title = "X: " + pt.X + " | Y: " + pt.Y;
}
}

Listing 27.15 Anzeige der Positionskoordinaten in der Titelleiste

Die Eigenschaft LeftButton (und analog ebenfalls MiddleButton und RightButton) ist vom Typ der Enumeration MouseButtonState, die mit Released und Pressed nur zwei Mitglieder aufweist.


Galileo Computing - Zum Seitenanfang

27.5.2 Auswerten der MausklicksZur nächsten ÜberschriftZur vorigen Überschrift

Im Zusammenhang mit dem Klicken auf eine Maustaste haben Sie zahlreiche Möglichkeiten, darauf zu reagieren:

  • PreviewMouseLeftButtonDown / MouseLeftButtonDown
  • PreviewMouseRightButtonDown / MouseRightButtonDown
  • PreviewMouseLeftButtonUp / MouseLeftButtonUp
  • PreviewMouseRightButtonUp / MouseRightButtonUp

Andere WPF-Komponenten ergänzen die genannten Events noch um weitere Ereignisse. Beispielsweise stellt die Klasse Control darüber hinaus auch die Ereignisse PreviewMouseDoubleClick und MouseDoubleClick bereit.

Die Ereignisse, die im Zusammenhang mit dem Klicken stehen, stellen ein MouseButtonEventArgs-Objekt bereit. Die Klasse MouseButtonEventArgs ist von MouseEventArgs abgeleitet und ergänzt diese um weitere Member, die Sie der folgenden Tabelle entnehmen können.

Tabelle 27.4 Zusätzliche Member der Klasse »MouseButtonEventArgs«

Eigenschaft Beschreibung

ButtonState

Wertet den Zustand der Taste aus, die mit dem Event verknüpft ist.

ChangedButton

Ruft die Taste ab, die mit dem Event verknüpft ist.

ClickCount

Ruft ab, wie oft die Taste gedrückt worden ist. Hier lässt sich zwischen einem Klick oder auch einem Doppelklick unterscheiden.

Viele Entwickler stehen vor der Frage, ob sie bei Berücksichtigung von Mausereignissen ihren Code in das MouseDown- oder MouseUp-Ereignis codieren sollen. Die Antwort dazu lautet: In Windows-Anwendungen wird normalerweise immer auf die Up-Ereignisse reagiert.


Galileo Computing - Zum Seitenanfang

27.5.3 CapturingZur vorigen Überschrift

Normalerweise wird kurze Zeit nach dem Auslösen des MouseDown-Ereignisses auch das korrespondierende MouseUp-Ereignis ausgelöst. Es gibt aber durchaus Situationen, in denen das nicht der Fall ist. Stellen Sie sich einfach vor, Sie würden sich mit der Maus über einem Element befinden, die Maustaste drücken und dann die Maus im gedrückten Zustand aus der Komponente ziehen. Erfolgt das Loslassen der Maus außerhalb der Komponente, ist diese nicht mehr Empfänger des MouseUp-Events.

Soll die Komponente dennoch das MouseUp-Ereignis empfangen, müssen Maßnahmen ergriffen werden. Dazu stellt die WPF jeder von der Klasse UIElement abgeleiteten Komponente mehrere Möglichkeiten zur Verfügung, die Mausereignisse bei Bedarf zu fangen (engl.: capture) oder wieder freizugeben (engl.: release). Fängt eine Komponente die Maus, werden die Mausereignisse für diese Komponente ausgelöst, auch dann, wenn die Maus den Bereich der Komponente bereits verlassen hat. Erst wenn die Komponente die Maus wieder freigibt, ist das Ereignisverhalten wieder »normal«.

Es stehen mehrere Möglichkeiten zur Verfügung, die Maus zu fangen. Zum einen stellt die Klasse Mouse (Namespace System.Windows.Input) mit Capture eine Methode bereit, der als Argument die Komponente übergeben werden kann, die Besitz von der Maus ergreift. Zudem erben alle von UIElement abgeleiteten Klassen die Methode CaptureMouse und ReleaseMouseCapture und stellen darüber hinaus mit IsMouseCaptured und IsMouseCaptureWithin zwei Eigenschaften bereit, die Auskunft darüber erteilen, ob die Mausereignisse für die entsprechende Komponente ausgelöst werden. Neben den genannten Eigenschaften lösen die UIElement-Komponenten auch die Ereignisse GotMouseCapture, LostMouseCapture, IsMouseCaptureChanged und IsMouseCaptureWithinChanged aus.

Das Fangen eines Mausereignisses sehen wir uns an einem Beispiel an. Nehmen wir an, in einem Window werde ein Element vom Typ Ellipse in Beige dargestellt. Das Element soll auf die beiden Ereignisse MouseDown und MouseUp in der Weise reagieren, dass beim Drücken der Maus die Ellipse mit der Füllfarbe Blau angezeigt wird, beim Loslassen der Maus soll die ursprüngliche Farbe Beige wieder zu sehen sein.

// Beispiel: ..\Kapitel 27\CaptureSample

<Window ...>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>

<RowDefinition/>
</Grid.RowDefinitions>
<Ellipse Fill="Beige" Grid.Row="0" Name="ellipse"
MouseDown="ellipse_MouseDown"
MouseUp="ellipse_MouseUp"></Ellipse>
</Grid>
</Window>

Listing 27.16 XAML-Code des Beispielprogramms »CaptureSample«

Im ersten Entwurf können die beiden Ereignishandler folgendermaßen implementiert werden:

private void ellipse_MouseDown(object sender, MouseButtonEventArgs e) {
Ellipse ellipse = (Ellipse)sender;
ellipse.Fill = Brushes.Blue;
}

private void ellipse_MouseUp(object sender, MouseButtonEventArgs e) {
Ellipse ellipse = (Ellipse)sender;
ellipse.Fill = Brushes.Beige;
}

Solange sich der Mauszeiger beim Klicken innerhalb des Bereichs der Ellipse befindet, schaltet ein Drücken der Maus die Füllfarbe auf Blau um und ein Loslassen zurück auf Beige. Halten Sie aber die Maustaste gedrückt, ziehen dann die Maus aus dem Bereich der Maus heraus und lassen erst dann die gedrückte Maustaste los, bleibt die Füllfarbe Blau erhalten.

Um das Problem mit einem Capturing der Maus zu lösen, müssen wir die Maus im Ereignishandler des MouseDown-Events mit der Methode CaptureMouse fangen. Die Methode liefert den Rückgabewert true, falls der Versuch gelingt. Falls das – aus welchen Gründen auch immer – nicht gelingt, darf die Füllfarbe auch nicht geändert werden. Daher ist der MouseDown-Ereignishandler wie folgt zu ändern:

private void ellipse_MouseDown(object sender, MouseButtonEventArgs e) {
Ellipse ellipse = (Ellipse)sender;
if (ellipse.CaptureMouse())
ellipse.Fill = Brushes.Blue;
}

Listing 27.17 Der Ereignishandler des »MouseDown«-Events

Jetzt gilt die Maus als gefangen, sie ist im Besitz des Ellipse-Elements. Das Programm funktioniert im ersten Moment wie gewünscht, allerdings gibt die Ellipse die Maus nicht frei. Das hat zur Konsequenz, dass weiterhin alle Mausklicks von der Ellipse empfangen werden – unabhängig davon, ob sich der Mauszeiger im Bereich der Ellipse befindet oder nicht. Zur Mausfreigabe muss zuerst überprüft werden, ob die Maus überhaupt im Besitz der Ellipse ist. Hier liefert die Eigenschaft IsMouseCaptured die notwendige Information. Die Freigabe selbst erfolgt durch Aufruf der Methode ReleaseMouseCapture.

private void ellipse_MouseUp(object sender, MouseButtonEventArgs e) {
Ellipse ellipse = (Ellipse)sender;
ellipse.Fill = Brushes.Beige;
if (ellipse.IsMouseCaptured)
ellipse.ReleaseMouseCapture();

}

Listing 27.18 Der Ereignishandler des »MouseUp«-Events



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Visual C# 2012

Visual C# 2012
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Katalog: Windows Presentation Foundation






 Windows Presentation
 Foundation


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: C++ Handbuch






 C++ Handbuch


Zum Katalog: C/C++






 C/C++


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2013
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de