TOC

This article has been localized into German by the community.

XAML:

Ereignisse in XAML

Wie die meisten modernen UI-Frameworks ist auch WPF ereignisbasiert. Alle Kontrollelemente, auch das zugrunde liegende Fenster, das ebenfalls von der Klasse der Kontrollelemente erbt, bieten eine Fülle an registrierbaren Ereignissen. Werden die Ereignisse in einem Element registriert, wird das Programm benachrichtigt sobald sie passieren und der Programmierer kann im CodeBehind darauf reagieren.

Es gibt viele unterschiedliche Arten von Ereignissen, sie werden jedoch meistens benutzt um auf die Tastatur- und Mauseingaben des Nutzers zu reagieren. Bei den meisten Kontrollelementen lässt sich ein KeyDown (Taste gedrückt), KeyUp (Taste losgelassen), MouseEnter (Maus wird über das Element bewegt) und/oder mehrere andere finden.

Wie Ereignisse in WPF funktionieren, werden wir uns noch genauer anschauen da das ganze ein weitläufiges Thema ist. Fürs erste reicht es aus zu wissen, wie ein Kontrollelement in XAML mit einem Stück Code aus dem CodeBehind verknüpft werden kann. Siehe dazu folgendes Beispiel:

<Window x:Class="WpfTutorialSamples.XAML.EventsSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="EventsSample" Height="300" Width="300">
	<Grid Name="pnlMainGrid" MouseUp="pnlMainGrid_MouseUp" Background="LightBlue">        
		
    </Grid>
</Window>

Wie man sieht wurde im Beispiel eine Methode (pnlMainGrid_MouseUp) mit dem MouseUp-Ereignis des Grids verknüpft. Diese Methode muss im CodeBehind definiert sein und die korrekte Ereignis-Signatur verwenden. In unserem Fall sollte das Ganze dann so aussehen:

private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
	MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());
}

Das MouseUp-Ereignis wird über einen MouseButtonEventHandler Delegaten gesteuert. Er benötigt zwei Parameter: einen Absender (das Kontrollelement, welches das Ereignis auslöst) und ein MouseButtonEventArgs-Objekt, das nützliche Zusatzinformationen beinhaltet. Wir nutzen es im Beispiel, um die Position des Mauszeigers zu ermitteln und sie dem Nutzer anzuzeigen.

Es können mehrere Kontrollelemente gleichzeitig auf den selben Delegatentyp zugreifen - zum Beispiel nutzen sowohl MouseUp als auch MouseDown den MouseButtonEventHandler Delegaten, während das MouseMove-Ereignis den MouseEventHandler Delegaten nutzt. Bevor eine Methode definiert wird, sollte der genutzte Delegat bekannt sein. Ist er das nicht, kann man jederzeit in der Dokumentation nachschlagen.

Glücklicherweise kann uns Visual Studio helfen, den korrekten EventHandler für ein Ereignis zu generieren. Der einfachste Weg ist hierbei den Namen des Ereignisses in der XAML-Datei einzutragen und sich Visual Studios IntelliSense um den Rest kümmern zu lassen:

Wählt man an dieser Stelle <New Event Handler> generiert Visual Studio einen geeigneten EventHandler in der CodeBehind-Datei. Es wird nach folgendem Schema benannt: <element name>_<ereignis name>, in unserem Fall also pnlMainGrid_MouseDown. Rechtsklicke den Namen des Ereignisses und wähle Navigate to Event Handler und Visual Studio zeigt dir die richtige Stelle.

Verknüpfungen über CodeBehind herstellen

Der gängigste Weg um Ereignisse zu verfolgen wird oben erklärt, trotzdem gibt es Situationen in denen man Kontrollelemente direkt aus dem CodeBehind verknüpfen möchte. Dies geschieht über den += Operator von C#, der dem Objekt direkt einen Event Handler hinzufügt. Die ausführliche Erklärung dessen gehört allerdings eher in ein spezielles C#-Beispiel. An dieser Stelle jedoch, zum Vergleich, ein kurzes Beispiel:

using System;
using System.Windows;
using System.Windows.Input;


namespace WpfTutorialSamples.XAML
{
	public partial class EventsSample : Window
	{
		public EventsSample()
		{
			InitializeComponent();
			pnlMainGrid.MouseUp += new MouseButtonEventHandler(pnlMainGrid_MouseUp);
		}

		private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)
		{
			MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());
		}

	}
}

Auch hier muss bekannt sein, welcher Delegat benutzt werden soll, und auch hier kann uns Visual Studio bei der Suche helfen. Sobald man folgendes eintippt:

pnlMainGrid.MouseDown +=

wird uns Visual Studio seine Hilfe anbieten:

Drücke die [Tab]-Taste zweimal und Visual Studio generiert den richtigen Event Handler, genau unter der derzeit angewählten Methode, bereit für die Implementierung. So kann man Ereignisse und Kontrollelemente ganz ohne XAML verknüpfen.