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.2 Routing-StrategienZur nächsten Überschrift

Auch wenn es bis jetzt den Anschein hat, dass die Ereignisse in der WPF keine Besonderheiten bergen – dem ist nicht so. Der Grund ist, dass in einer WPF-Benutzeroberfläche die Elemente ineinander verschachtelt werden können, beispielsweise:

<Window>
<StackPanel>
<Button Height="110" Width="250" Margin="10">
<StackPanel Orientation="Horizontal">
<Image Source="smile.jpg" Stretch="None" />
<Label VerticalAlignment="Center">Abbrechen</Label>
</StackPanel>
</Button>
[...]
</StackPanel>
</Window>

Listing 27.3 Verschachtelte Elemente im XAML-Code

Hier enthält ein StackPanel einen Button, der seinerseits als Inhaltseigenschaft ein weiteres StackPanel beschreibt. In diesem sind eine Image- und eine Label-Komponente horizontal angeordnet. Mit der Vorgabe dieser Struktur könnte zur Laufzeit das Folgende passieren: Der Anwender möchte auf den Button klicken, trifft dabei aber das Label. In herkömmlichen GUIs würde das Label sein eigenes Click-Ereignis auslösen, während der Button keine Reaktion zeigt. Das gilt natürlich auch, wenn auf das Image geklickt wird. Probleme dieser Art gibt es eigentlich in allen Benutzeroberflächen. Natürlich lässt sich im Falle unseres auf dem Button positionierten Labels auch in herkömmlichen GUIs das Click-Ereignis der Schaltfläche auslösen, aber der Aufwand dafür ist nicht unerheblich.

Um eine einfache Lösung zu ermöglichen, erweitert die WPF das traditionelle Konzept der Ereignisse um die Routed Events. Dabei müssen wir drei verschiedene Routing-Strategien unterscheiden:

  • Direkte Events: Als direkte Ereignisse werden die Ereignisse bezeichnet, die nur von dem Element, bei dem das Ereignis aufgetreten ist, ausgelöst werden. Direkte Ereignisse unterscheiden sich nicht von den sonst üblichen Ereignissen im .NET Framework. Das Ereignis Click ist beispielsweise ein direkter Event.
  • Tunneling-Events: Beim Tunneling beginnt die Ereigniskette beim Wurzelelement. In der Regel wird es sich dabei um ein Window handeln. Das Ereignis wird also zuerst im Window ausgelöst und danach im nächsten untergeordneten Element. Von dort setzt sich die Ereignisauslösung im nächsten untergeordneten Element fort. In Listing 27.3 wäre das das StackPanel. Das geschieht so lange, bis der eigentliche Auslöser erreicht ist. Tunneling-Events sind durch das Präfix Preview gekennzeichnet.
  • Bubbling-Events: Das Bubbling beschreibt genau die Umkehrung des Tunneling-Prinzips. Zuerst wird der Event in der eigentlichen Komponente ausgelöst, anschließend wird die Ereignisauslösung der Reihe nach an die übergeordneten Elemente im Elementbaum weitergereicht bis hin zum Wurzelelement.

Bei den Routed Events kommt es also zu einer klaren Abfolge von Ereignisauslösungen. Legen wir das Listing 27.3 von oben zugrunde, würde zuerst das Ereignis im Window ausgelöst, anschließend im StackPanel und dann im Button. Da die Schaltfläche ihrerseits ein StackPanel enthält, ist dieses der nächste Empfänger. Zuletzt kommt dann eventuell noch das Image oder das Label.

Ist die Kette der Tunneling-Events durchlaufen, geht es mit den Bubbling-Events in entgegengesetzter Richtung zurück. Also zuerst der Bubbling-Event im Image oder Label, dann folgt das innere StackPanel, der Button, das äußere StackPanel und letztendlich das Window. Abbildung 27.1 verdeutlicht den Zusammenhang.

Abbildung

Abbildung 27.1 Elementbaum aus Listing 27.3 und Routed Events

Es werden in der Kette alle Handler aufgerufen, die sich bei dem Ereignis registriert haben. Behandelt ein Element innerhalb des Elementbaums das aufgetretene Ereignis nicht, wird die Ereigniskette nicht unterbrochen.


Galileo Computing - Zum Seitenanfang

27.2.1 Der durchlaufene ElementbaumZur nächsten ÜberschriftZur vorigen Überschrift

In der WPF wird zwischen dem visuellen Elementbaum (Visual Tree) und dem logischen Elementbaum (Logical Tree) unterschieden (siehe Kapitel 18). In der Regel wird von einem Routed Event der Visual Tree durchlaufen. Aus der Wortwahl können Sie entnehmen, dass das nicht immer so ist. Hintergrund ist, dass Routed Events nur von Komponenten ausgelöst werden können, die auf eine der folgenden Klassen zurückzuführen sind: UIElement, UIElement3D oder ContentElement. ContentElement-Instanzen gehören aber nicht zum Visual Tree, sondern zum Logical Tree. Somit wäre es nicht richtig, zu sagen, dass ausschließlich der Virtual Tree durchlaufen wird – obwohl das im überwiegenden Teil der Fälle so ist.


Galileo Computing - Zum Seitenanfang

27.2.2 BeispielanwendungZur nächsten ÜberschriftZur vorigen Überschrift

Die Routed Events wollen wir uns nun an einem Beispiel ansehen, dem das Codefragment von oben zugrunde liegt. Es werden hier die Ereignisse PreviewMouseRightButtonDown (getunnelt) und MouseRightButtonDown (gebubbelt) behandelt, die beim Drücken der rechten Maustaste ausgelöst werden. Damit die Abfolge der Ereigniskette auch optisch sichtbar wird, enthält das Window zusätzlich noch eine ListBox, in der sich jeder ausgelöste Event einträgt. Der entsprechende Code dafür ist in der Code-Behind-Datei zu finden.

// Beispiel: ..\Kapitel 27\RoutedEventSamples\Sample1

<Window ...
PreviewMouseRightButtonDown="PreviewMouseRight"
MouseRightButtonDown="MouseRight">
<StackPanel MouseRightButtonDown="MouseRight"
PreviewMouseRightButtonDown="PreviewMouseRight">
<Button MouseRightButtonDown="MouseRight"
PreviewMouseRightButtonDown="PreviewMouseRight">
<StackPanel Orientation="Horizontal" MouseRightButtonDown="MouseRight"
PreviewMouseRightButtonDown="PreviewMouseRight">
<Image MouseRightButtonDown="MouseRight"
PreviewMouseRightButtonDown="PreviewMouseRight"/>
<Label MouseRightButtonDown="MouseRight"
PreviewMouseRightButtonDown="PreviewMouseRight">
Abbrechen
</Label>
</StackPanel>
</Button>
<ListBox x:Name="listBox1"></ListBox>
<Grid>


<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="120"/>
</Grid.ColumnDefinitions>
<Button Click="Button_Click">Liste löschen</Button>
</Grid>
</StackPanel>
</Window>

// Code in der Code-Behind-Datei

private void MouseRight(object sender, MouseButtonEventArgs e) {
listBox1.Items.Add(sender.ToString());
}

private void PreviewMouseRight(object sender, MouseButtonEventArgs e) {
listBox1.Items.Add("Preview: " + sender.ToString());
}

private void Button_Click(object sender, RoutedEventArgs e) {
listBox1.Items.Clear();
}

Listing 27.4 Demonstration der Routed Events

Das Klicken auf das Image führt zu der in Abbildung 27.2 gezeigten Ausgabe.

Abbildung

Abbildung 27.2 Routed Events beim Klicken auf das Image mit der rechten Maustaste


Galileo Computing - Zum Seitenanfang

27.2.3 Sonderfall der MausereignisseZur vorigen Überschrift

Werden die beiden Ereignisse PreviewMouseRightButtonDown und MouseRightButtonDown durch die Paare PreviewMouseLeftButtonDown/ MouseLeftButtonDown bzw. PreviewMouseDown/MouseDown ersetzt, tritt ein seltsames Phänomen auf: Bei den gebubbelten Events wird der letzte Ereignishandleraufruf vom StackPanel ausgeführt, das sich innerhalb des Buttons befindet. Alle anderen gebubbelten Events werden unterdrückt und nicht mehr ausgelöst. Offensichtlich wird die Ereigniskette an dieser Stelle unterbrochen (siehe Abbildung 27.3).

Ursache für diese Verhaltensweise ist, dass im Ereignis MouseLeftButtonDown (und auch MouseLeftButtonUp) das Click-Ereignis ausgelöst wird. Dieses ersetzt MouseLeftButtonDown und MouseLeftButtonUp und unterbricht den Bubbling-Prozess, indem der ausgelöste Event als behandelt gekennzeichnet wird. Wie man dennoch die gebubbelte Ereigniskette weiter fortsetzen kann, werde ich Ihnen später noch zeigen.

Abbildung

Abbildung 27.3 Routed Events, wenn die Ereigniskette des »MouseDown-Events« durchlaufen wird

Das Beispielprogramm, dem Abbildung 27.3 zugrunde liegt, ist unter \Kapitel 27\RoutedEventSamples\Sample4 zu finden. Wie Sie den beschriebenen Effekt unterbinden können, wird in Abschnitt 27.4.3 beschrieben.



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