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.3 Der EreignishandlerZur nächsten Überschrift

Lassen Sie uns jetzt einen Blick auf die Ereignishandler der Routed Events werfen. Im Grunde genommen unterscheiden sich die Parameter nicht von denen der klassischen CLR-Ereignisse: Im ersten Parameter gibt sich der Auslöser des Events bekannt, im zweiten werden ereignisspezifische Daten bereitgestellt. Während in CLR-Ereignissen der zweite Parameter immer vom Typ EventArgs ist, basiert der zweite Parameter eines Routed Events auf dem Typ RoutedEventArgs (der übrigens selbst von EventArgs abgeleitet ist).

Alle EventArgs-Parameter in der WPF sind von RoutedEventArgs abgeleitet. Im Code des letzten Beispiels handelt es sich dabei um ein Objekt vom Typ MouseButtonEventArgs. Dieser Typ ist über seine direkte Basis MouseEventArgs auf RoutedEventArgs zurückzuführen.


Galileo Computing - Zum Seitenanfang

27.3.1 Die Klasse »RoutedEventArgs«Zur nächsten ÜberschriftZur vorigen Überschrift

RoutedEventArgs liefert insgesamt vier interessante Informationen, die Sie Tabelle 27.1 entnehmen können.

Tabelle 27.1 Die Eigenschaften der Klasse »RoutedEventArgs«

Eigenschaft Beschreibung

Handled

Diese Eigenschaft ermöglicht es, den Routing-Prozess zu stoppen. Dazu ist Handled auf true zu setzen. Dadurch wird die Ereigniskette nicht nur unterbrochen, sondern beendet.

RoutedEvent

Diese Eigenschaft liefert die RoutedEvent-Instanz, die mit dem RoutedEventArgs-Objekt verbunden ist.

Source

Gibt das Element an, das für die Einleitung des Routing-Prozesses verantwortlich zeichnet.

OriginalSource

Liefert das Objekt aus dem Visual Tree, das ursächlich das Ereignis ausgelöst hat.

Vermutlich wird Ihnen der Unterschied zwischen den beiden Eigenschaften Source und OriginalSource nicht sofort klar sein. Die Konfusion wird vermutlich perfekt, wenn außer diesen beiden Eigenschaften auch noch der erste Parameter (sender) des Ereignishandlers in unsere Betrachtung einbezogen wird. Worin unterscheiden sich sender, Source und OriginalSource?


Galileo Computing - Zum Seitenanfang

27.3.2 Die Quelle des Routing-ProzessesZur nächsten ÜberschriftZur vorigen Überschrift

Am besten verständlich wird der Unterschied, wenn wir die Ausgabe des Beispiels Sample1 von oben entsprechend anpassen. Dabei ist es vollkommen ausreichend, wenn wir uns auf die gebubbelten Events beschränken.

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

<Window ...
MouseRightButtonDown="MouseRight">
<StackPanel MouseRightButtonDown="MouseRight">
<Button MouseRightButtonDown="MouseRight">
<StackPanel MouseRightButtonDown="MouseRight">
<Image MouseRightButtonDown="MouseRight"/>
<Label MouseRightButtonDown="MouseRight">Abbrechen</Label>
</StackPanel>
</Button>
<ListBox x:Name="listBox1"></ListBox>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="120"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="1" Click="Button_Click">Liste löschen</Button>
</Grid>
</StackPanel>
</Window>

// Programmcode in der Code-Behind-Datei

private void MouseRight(object sender, MouseButtonEventArgs e) {
string message = "Sender: " + sender + "\n";
message += "Source: " + e.Source + "\n";
message += "OriginalSource: " + e.OriginalSource + "\n";
listBox1.Items.Add(message);
}

Listing 27.5 Demonstration der EventArgs-Parameter

Klicken wir auf das Label, werden die Resultate in der ListBox angezeigt. Der besseren Übersicht wegen sei die Ausgabe tabellarisch wiedergegeben.

Tabelle 27.2 Ausgaben, wenn auf das Label geklickt wird

Sender Source OriginalSource

Label

Label

TextBlock

StackPanel

Label

TextBlock

Button

Label

TextBlock

StackPanel

Label

TextBlock

Window

Label

TextBlock

Die Aussage, dass die gebubbelten Ereignisse ausgehend vom Label im Elementbaum nach oben bis zum Fenster weitergereicht werden, sehen wir in der Ausgabe des Parameters sender bestätigt. Der Parameter liefert die Komponente, die aktuell das Ereignis ausgelöst hat – obwohl der Verursacher der Ereigniskette eine ganz andere Komponente ist.

Die Eigenschaft Source beschreibt den tatsächlichen Auslöser des Routing-Prozesses: Hier ist es das Label. Allgemein gesprochen handelt es sich dabei um die Komponente, die sowohl im Virtual Tree als auch im Logical Tree zu finden ist.

Die Angabe OriginalSource geht ins Detail. Hierzu sei erklärend gesagt, dass jedes Steuerelement durch eine »Schablone« beschrieben wird, das sogenannte ControlTemplate. Die Komponente TextBlock ist innerhalb des ControlTemplates eines Labels die Komponente, die für die Ausgabe des Textes sorgt. Somit beschreibt die Eigenschaft OriginalSource das Element aus dem Visual Tree, das im Hintergrund tatsächlich für die Eventauslösung verantwortlich ist.


Galileo Computing - Zum Seitenanfang

27.3.3 Die Eigenschaft »Handled«Zur nächsten ÜberschriftZur vorigen Überschrift

Innerhalb eines Ereignishandlers kann die Eigenschaft Handled dazu verwendet werden, ein Ereignis als »behandelt« zu markieren. Dazu wird Handled=true gesetzt. Die Folge ist, dass die Aufrufe aller weiteren Ereignishandler, die auf der Route des Ereignisses liegen, unterdrückt werden. Dies lässt sich sehr schnell anhand des Beispiels Sample2 überprüfen.

private void MouseRight(object sender, MouseButtonEventArgs e) {
string message = "Sender: " + sender + "\n";
message += "Source: " + e.Source + "\n";
message += "OriginalSource: " + e.OriginalSource + "\n";
listBox1.Items.Add(message);
if (sender is Button) e.Handled = true;

}

Listing 27.6 Ergänzung des Ereignishandlers aus dem Beispiel »Sample2«

Das »äußere« StackPanel und das Window werden den Ereignishandler nicht mehr aufrufen.

Auch wenn Handled auf true gesetzt ist, durchläuft das System weiterhin die komplette Route. Tatsächlich gibt es sogar die Möglichkeit, einen Ereignishandler ausführen zu lassen, wenn vorher das Ereignis bereits mit Handled=true für behandelt erklärt wird. Wie das gemacht wird, sehen Sie am Beispiel des Buttons in Abschnitt 27.4.3.


Galileo Computing - Zum Seitenanfang

27.3.4 Registrieren und Deregistrieren eines Ereignishandlers mit CodeZur vorigen Überschrift

Zur Installation des Ereignishandlers eines Routed Events stehen Ihnen zwei Möglichkeiten zur Verfügung. Sie können einerseits mit »+=« in bekannter Weise das Ereignis mit einem Ereignishandler verbinden, z. B.:

button1.Click += new RoutedEventHandler(button1_Click);

Die zweite Variante stellt die Methode AddHandler dar, die von den Klassen UIElement, UIElement3D und ContentElement bereitgestellt wird und auf das von diesen Klassen implementierte Interface IInputElement zurückzuführen ist.

button1.AddHandler(Button.ClickEvent, new RoutedEventHandler(button1_Click))

Das Deregistrieren eines Event Handlers erfolgt ähnlich. Entweder Sie benutzen -=, also z. B.

button1.Click -= new RoutedEventHandler(button1_Click);

oder die Methode RemoveHandler:

button1.RemoveHandler(Button.ClickEvent, new RoutedEventHandler(button1_Click))


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