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

Inhaltsverzeichnis
1 Einführung
2 Grundlagen der Sprachsyntax
3 Klassendesign
4 Weitere Datentypen
5 Multithreading
6 Collections und LINQ
7 Eingabe und Ausgabe
8 Anwendungen: Struktur und Installation
9 Code erstellen und debuggen
10 Einige Basisklassen
11 Windows-Anwendungen erstellen
12 Die wichtigsten Steuerelemente
13 Tastatur- und Mausereignisse
14 MDI-Anwendungen
15 Grafiken mit GDI+
16 Drucken
17 Entwickeln von Steuerelementen
18 Programmiertechniken
19 WPF – Grundlagen
20 Layoutcontainer
21 WPF-Steuerelemente
22 Konzepte von WPF
23 Datenbankverbindung mit ADO.NET
24 Datenbankabfragen mit ADO.NET
25 DataAdapter
26 Offline mit DataSet
27 Datenbanken aktualisieren
28 Stark typisierte DataSets
A Anhang: Einige Übersichten
Stichwort

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Visual Basic 2008 von Andreas Kuehnel, Stephan Leibbrandt
Das umfassende Handbuch
Buch: Visual Basic 2008

Visual Basic 2008
3., aktualisierte und erweiterte Auflage, geb., mit DVD
1.323 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1171-0
Pfeil 21 WPF-Steuerelemente
Pfeil 21.1 Ereignisse programmieren
Pfeil 21.1.1 Weiterleiten von Ereignissen
Pfeil 21.1.2 Event Bubbling
Pfeil 21.1.3 Event Tunneling
Pfeil 21.1.4 Weiterleitung abbrechen
Pfeil 21.1.5 Reihenfolge der Routed Events
Pfeil 21.2 Die Basisklasse Control
Pfeil 21.3 Familie der Buttons
Pfeil 21.3.1 Button
Pfeil 21.3.2 RepeatButton
Pfeil 21.3.3 ToggleButton
Pfeil 21.4 Textboxen
Pfeil 21.4.1 TextBox
Pfeil 21.4.2 PasswordBox
Pfeil 21.5 Label
Pfeil 21.6 Auswahlelemente
Pfeil 21.6.1 CheckBox
Pfeil 21.6.2 RadioButton
Pfeil 21.7 Listen
Pfeil 21.7.1 ListBox
Pfeil 21.7.2 ComboBox
Pfeil 21.8 Menüleiste
Pfeil 21.8.1 Gestaltung der Menüelemente
Pfeil 21.8.2 Symbole anzeigen
Pfeil 21.8.3 Tastenkürzel
Pfeil 21.8.4 Selektierbare Menüelemente
Pfeil 21.9 Kontextmenü
Pfeil 21.10 Symbolleisten
Pfeil 21.10.1 Positionieren mit der Komponente ToolBarTray
Pfeil 21.11 Statusleiste
Pfeil 21.12 Bilder mit Image
Pfeil 21.12.1 Grafik zur Laufzeit laden

Dieses Kapitel stellt eine repräsentative Auswahl an Steuerelementen vor, mit der Sie viele Anwendungen programmieren können.

21 WPF-Steuerelemente

Alle für Benutzeroberflächen üblichen Steuerelemente sind im WPF-Framework enthalten, von einem einfachen Steuerelement wie einer Schaltfläche bis hin zu komplexen Steuerelementen wie Baumansichten. Um übersichtlich zu bleiben, greift dieses Kapitel eine repräsentative Auswahl heraus.

Beim Blick in die Dokumentation sollten Sie beachten, dass es viele gleichnamige Steuerelemente im WinForms-Namensraum System.Windows.Forms und im WPF-Namensraum System.Windows gibt. Der falsche Namensraum fällt oft nicht sofort auf, da viele Steuerelemente sich stark ähneln.


Rheinwerk Computing - Zum Seitenanfang

21.1 Ereignisse programmieren Zur nächsten ÜberschriftZur vorigen Überschrift

Wie alle modernen Benutzeroberflächen reagiert auch eine WPF-Anwendung nur auf Ereignisse. Fast jedes Ereignis in WindowsForms hat eine Entsprechung in WPF (aber nicht umgekehrt, siehe unten). Die Ereignishandler haben zwei Parameter: das auslösende Element vom Typ Object und Ereignisinformationen vom Typ EventArgs oder einer davon abgeleiteten Klasse.

Wie bei WindowsForms-Anwendungen hat das Eigenschaftsfenster eine Ereignisliste. Zusätzlich bietet die XAML-Datei IntelliSense-Unterstützung. Handler werden nicht mit einer Handles-Klausel, sondern dynamisch an das Ereignis gebunden.

Angenommen, Sie möchten das Click-Ereignis einer Schaltfläche in der XAML-Datei programmieren. In der IntelliSense-Unterstützung wählen Sie das Click-Ereignis und binden durch zweimaliges Drücken der Taste Tabulator -Taste das Ereignis an einen Ereignishandler, der in der Code-Behind-Datei erzeugt wird. Gegebenenfalls müssen Sie die Datei manuell öffnen.

<Grid> 
  <Button Click="button1_Click"  Height="30" Name="button1" 
          Margin="70,95,133,0">Button1</Button> 
</Grid>

Hat eine Komponente ein Standardereignis, wie zum Beispiel Button, können Sie den Ereignishandler auch mittels Doppelklick auf die Komponente erzeugen. In diesem Fall wird er mit einer Handles-Klausel an das Ereignis gebunden.

Alternativ (nicht additiv) können Sie die Verknüpfung zwischen Ereignis und Ereignishandler auch im Code festlegen, zum Beispiel:

Public Partial Class Window1 : Inherits Window

  Private Sub Laden(sender As Object, e As RoutedEventArgs) _ 
  Handles MyBase.Loaded 
    AddHandler Button1.Click, AddressOf Button1_Click 
  End Sub

  Private Sub Button1_Click(sender As Object, e As RoutedEventArgs) 
    MessageBox.Show("Im Click-Ereignishandler 1") 
  End Sub

  Private Sub Button2_Click(sender As Object, e As RoutedEventArgs) _ 
  Handles Button2.Click 
    MessageBox.Show("Im Click-Ereignishandler 2") 
  End Sub

End Class

Rheinwerk Computing - Zum Seitenanfang

21.1.1 Weiterleiten von Ereignissen Zur nächsten ÜberschriftZur vorigen Überschrift

Die Auslösung eines Ereignisses ist unabhängig von dessen Behandlung. Jede Ereignisart hat geeignete Routinen, die entscheiden, welche der möglichen Ereignishandler von einem konkreten Ereignis betroffen sind. Zum Beispiel kommen bei einem Click-Ereignis alle Elemente unter der aktuellen Mausposition prinzipiell in Betracht. Im einfachsten Fall »gewinnt« von diesen die zuoberst liegende Komponente: Nur sie behandelt das Ereignis. Zum Beispiel ist nur ein Button betroffen und nicht die optisch darunter- und logisch darüberliegende Form, sie erfährt überhaupt nichts von dem Ereignis. Das ist ein Ereignismodell, wie es in WinForms implementiert ist.

WPF-Komponenten ergänzen dieses Ereignismodell durch die Möglichkeit der Weiterleitung von Ereignissen an über- sowie untergeordnete Komponenten. So können mehrere Komponenten gleichzeitig von einem Ereignis betroffen sein. Im Beispiel des Click-Ereignisses wird auch ein Ereignishandler im übergeordneten WPF-Window aufgerufen. Die Möglichkeit einer Weiterleitung ist sinnvoll, denn in der WPF können Komponenten beliebig ineinander verschachtelt werden.

Ereignisse in WPF, die weitergeleitet werden können, werden als Routed Events bezeichnet. Es gibt drei verschiedene Mechanismen der Ereignisbehandlung:

  • Die einfachste Variante funktioniert wie in Windows-Forms. Ein Ereignis wird nur von der Komponente verarbeitet, bei der es aufgetreten ist. Es wird Direct genannt.
  • Beim Bubbling eines Ereignisses wird es an die übergeordnete Komponente weitergereicht. Diese kann nun ebenfalls darauf reagieren und/oder es weiterreichen.
  • Beim Tunneling beginnt die Ereigniskette beim Wurzelelement, in der Regel Window. Es reicht das Ereignis an das nächste untergeordnete Element weiter, das seinerseits das ihm untergeordnete Element informiert. Das geht so lange, bis der Auslöser erreicht ist. Die Tunneling-Ereignisse sind durch das Präfix Preview gekennzeichnet.

Wir wollen uns nun ansehen, wie die Ereignisweiterleitung funktioniert.


Rheinwerk Computing - Zum Seitenanfang

21.1.2 Event Bubbling Zur nächsten ÜberschriftZur vorigen Überschrift

Das folgende Beispielprogramm definiert in Window ein StackPanel, das einen Button und eine ListBox enthält. Der Button hat ein untergeordnetes Element vom Typ Label. Die ListBox dient ausschließlich der Anzeige der Abläufe.

Event Bubbling bedeutet, dass ein Ereignis nach der direkt betroffenen Komponente sukzessive an übergeordnete Komponenten weitergereicht wird, ähnlich wie Blasen, die in einer Flüssigkeit aufsteigen. Im folgenden Beispiel, dessen Ansicht Sie in Abbildung 21.1 sehen, testen wir das für das Ereignis MouseDown. Beachten Sie, dass dieses Ereignis sowohl für das Label als auch für den Button, das StackPanel und das Window definiert ist.

Nach diesen Überlegungen muss ein Klick auf das Label bewirken, dass das Ereignis zuerst im Label, danach der Reihe nach im Button, dem StackPanel und zuletzt in Window verarbeitet werden. Wird nur der Button angeklickt, wird das Ereignis an das StackPanel und das Window weitergereicht. Sehen wir uns zuerst den XAML-Code an:


'...\WPFControls\Ereignisse\Bubbling.xaml

<Window x:Class="Bubbling" 
    ... 
    MouseDown="Klick"> 
  <StackPanel MouseDown="Klick"> 
    <Button Name="button1"> 
      <Label Name="label1" MouseDown="Klick">Label1</Label> 
    </Button> 
    <ListBox Name="listBox1"></ListBox> 
  </StackPanel> 
</Window>

Nun folgt noch der Code in der Code-Behind-Datei:


'...\WPFControls\Ereignisse\Bubbling.xaml.vb

Partial Public Class Bubbling

  Private Sub Laden(sender As Object, e As RoutedEventArgs) Handles MyBase.Loaded 
    button1.AddHandler(MouseDownEvent, _ 
            New MouseButtonEventHandler(AddressOf Me.Klick), _ 
            True) 
  End Sub

  Private Sub Klick(sender As Object, e As MouseButtonEventArgs) 
    If (TypeOf sender Is Button) Then : listBox1.Items.Add("BUTTON") 
    ElseIf TypeOf sender Is Label Then : listBox1.Items.Add("LABEL") 
    ElseIf TypeOf sender Is Menu Then : listBox1.Items.Add("MENU") 
    ElseIf TypeOf sender Is StackPanel Then 
      listBox1.Items.Add("STACKPANEL") 
    ElseIf TypeOf sender Is Bubbling Then : listBox1.Items.Add("WINDOW") 
    End If 
    e.Handled = False 
  End Sub

End Class

Abbildung 21.1 Bubbling

Wie Sie in Abbildung 21.1: Bubbling sehen, wird bei einem Klick auf das Label das Ereignis durch die Hierarchie bis an das Wurzelelement Window weitergereicht.

Das Ereignis MouseDown für den Button ist nicht in der XAML-Datei registriert, sondern durch die Methode AddHandler in der Code-Behind-Datei.

button1.AddHandler(MouseDownEvent, _ 
                   New MouseButtonEventHandler(AddressOf Me.Klick), True)

Der Methode übergeben Sie zuerst den Ereignistyp, danach ein Delegate auf den Ereignishandler. Der boolesche Parameter gibt an, ob bereits behandelte Ereignisse weiterverarbeitet werden sollen. Für False wird – bei einem Klick auf Label – nur das Ereignis für das Label behandelt, alle anderen nicht mehr, da der Button bei dieser Einstellung die Ereigniskette unterbricht. Ein Klick auf den Button zeigt keine sichtbare Reaktion. Das MouseDown-Ereignis wird vom Button in ein Click-Ereignis umgemünzt, und Ersteres wird als behandelt markiert, bevor unser Ereignishandler aufgerufen wird und durch die Einstellung False die Behandlung ablehnt. Verwenden Sie statt Button ein Menu, werden beim Klick auf das Menü die Ereignisse für Menu, StackPanel und Window ausgelöst. Für den Wert True werden beim Klick auf den Button die Ereignisse für Button, StackPanel und Window ausgelöst.

Die Weiterleitung von Ereignissen ist ein passiver Vorgang. Eine Komponente kann die Ereigniskette aktiv unterbrechen, die Weiterleitung dagegen läuft automatisch. Daher spielt es auch keine Rolle, ob sich jede Komponente in einer Hierarchie für ein Ereignis interessiert. Regis-triert ein »Zwischenelement«, beispielsweise das StackPanel, das Ereignis nicht, wird es einfach übersprungen, und es wird mit der darüberliegenden Komponente fortgefahren.


Rheinwerk Computing - Zum Seitenanfang

21.1.3 Event Tunneling Zur nächsten ÜberschriftZur vorigen Überschrift

Getunnelte Ereignisse verlaufen analog, nur die Richtung ist umgekehrt: vom obersten Element in der Hierarchie bis zum eigentlichen Ereignisempfänger. Im vorigen Beispiel müssen wir nur MouseDown durch PreviewMouseDown ersetzen. Da durch die umgekehrte Richtung beim Klick auf den Button er der letzte in der Hierarchie ist, kann auf eine besondere Form der Registrierung verzichtet werden, und sie erfolgt in der XAML-Datei.


'...\WPFControls\Ereignisse\Tunneling.xaml

<Window x:Class="Tunneling" 
    ... 
    PreviewMouseDown="Klick"> 
  <StackPanel PreviewMouseDown="Klick"> 
    <Button Name="button1" PreviewMouseDown="Klick"> 
      <Label Name="label1" PreviewMouseDown="Klick">Label1</Label> 
    </Button> 
    <ListBox Name="listBox1"></ListBox> 
  </StackPanel> 
</Window>

'...\WPFControls\Ereignisse\Tunneling.xaml.vb

Partial Public Class Tunneling 
  Private Sub Klick(sender As Object, e As MouseButtonEventArgs) 
    If (TypeOf sender Is Button) Then : listBox1.Items.Add("BUTTON") 
    ElseIf TypeOf sender Is Label Then : listBox1.Items.Add("LABEL") 
    ElseIf TypeOf sender Is StackPanel Then 
      listBox1.Items.Add("STACKPANEL") 
    ElseIf TypeOf sender Is Tunneling Then : listBox1.Items.Add("WINDOW") 
    End If 
  End Sub 
End Class

Nun beginnen die Ereignisse im an oberster Stelle stehenden Window und pflanzen sich über StackPanel bis zum Auslöser durch. Bei Abbildung 21.2 wurde auf das Label geklickt, und ein Klick auf den Button löst die Kette Window, StackPanel, Button aus.

Abbildung 21.2 Tunneling


Rheinwerk Computing - Zum Seitenanfang

21.1.4 Weiterleitung abbrechen Zur nächsten ÜberschriftZur vorigen Überschrift

Bei einem Ereignis kann die Ereigniskette abgebrochen werden, indem der Eigenschaft Handled des EventArgs-Parameters der Wert True zugewiesen wird. Außerdem dürfen Ereignishandler nicht, wie der Button im Bubbling-Beispiel, den Abbruch unterdrücken (butt.AddHandler(Ereignis, Handler, True)). Um das zu testen, ändern Sie den Code des vorigen Beispiels durch Einfügen der fett gesetzten Zeile:


'...\WPFControls\Ereignisse\Abbruch.xaml.vb

Partial Public Class Abbruch 
  Private Sub Klick(ByVal sender As Object, ByVal e As MouseButtonEventArgs) 
    If (TypeOf sender Is Button) Then : listBox1.Items.Add("BUTTON") 
    ElseIf TypeOf sender Is Label Then : listBox1.Items.Add("LABEL") 
    ElseIf TypeOf sender Is StackPanel Then 
      e.Handled = True 
      listBox1.Items.Add("STACKPANEL") 
    ElseIf TypeOf sender Is Abbruch Then : listBox1.Items.Add("WINDOW") 
    End If 
  End Sub 
End Class

Da der Ereigniscode für das StackPanel die Ereigniskette als behandelt kennzeichnet, werden die Ereignisse von Button und Label nicht mehr behandelt.


Rheinwerk Computing - Zum Seitenanfang

21.1.5 Reihenfolge der Routed Events topZur vorigen Überschrift

Sie können Tunneled- und Bubbling-Ereignisse gleichzeitig registrieren. Das folgende Beispiel zeigt die Reihenfolge weitergeleiteter Ereignisse. Zuerst das Layout:


'...\WPFControls\Ereignisse\Reihenfolge.xaml

<Window x:Class="Reihenfolge" 
    xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation 
    xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml 
    Title="Reihenfolge" Height="300" Width="300"> 
    <StackPanel> 
        <Label Background="Red" Height="50"> 
            <Image Name="Bild" Source="Bilder\Eisblumen.jpg"/> 
        </Label> 
        <ListBox Name="listBox1"></ListBox> 
    </StackPanel> 
</Window>

Nun der Visual Basic-Code in der Code-Behind-Datei mit der Registrierung der Handler:


'...\WPFControls\Ereignisse\Reihenfolge.xaml.vb

Partial Public Class Reihenfolge 
  Private Sub Registrieren(ByVal elem As FrameworkElement) 
    elem.AddHandler(MouseDownEvent, _ 
                    New MouseButtonEventHandler(AddressOf Klick)) 
    elem.AddHandler(PreviewMouseDownEvent, _ 
                    New MouseButtonEventHandler(AddressOf Klick)) 
    If elem.Parent IsNot Nothing Then Registrieren(elem.Parent) 
  End Sub

  Private Sub Laden(ByVal sender As Object, ByVal e As RoutedEventArgs) _ 
  Handles MyBase.Loaded 
    Registrieren(Bild) 
  End Sub

  Private Sub Klick(ByVal sender As Object, ByVal e As MouseButtonEventArgs) 
    listBox1.Items.Add(e.RoutedEvent.Name & " – " & _ 
                       sender.GetType().Name)

  End Sub 
End Class

Auch hier werden die Abläufe in einer ListBox registriert. Abbildung 21.3 zeigt, dass zuerst die getunnelten Events ausgelöst werden, beginnend beim Fenster. Nachdem das auslösende Element Image erreicht ist, setzt sich die Ereigniskette mit den Bubbled Events bis zum Wurzelelement Reihenfolge fort.

Abbildung 21.3 Ereigniskette



Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Visual Basic 2008
Visual Basic 2008
Jetzt Buch bestellen


 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Rheinwerk-Shop: Visual Basic 2012






 Visual Basic 2012


Zum Rheinwerk-Shop: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Rheinwerk-Shop: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Rheinwerk-Shop: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Rheinwerk-Shop: Windows Presentation Foundation






 Windows Presentation
 Foundation


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2009
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.


Nutzungsbestimmungen | Datenschutz | Impressum

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

Cookie-Einstellungen ändern