WPF: Menüs

Um in einem WPF-Fenster ein Hauptmenü anzuzeigen, benötigen wir das Menu-Element. Das Menu-Objekt benötigt standardmäßig immer die komplette Breite des Fensters (was auch so üblich ist). Das Menü erhält untergeordnete Elemente in Form von MenuItem-Elementen. Natürlich ist es auch möglich, die MenuItem-Elemente zu verschachteln, um so eine Baumstruktur aufzubauen. Bei Bedarf ist auch eine mehrfache Verschachtelung möglich. Dem MenuItem wird über die Eigenschaft Header der anzuzeigende Name übergeben. Über das Attribut Click können wir die Ereignis-Funktion für das Klicken auf eines der Menü-Einträge registrieren. Über die Eigenschaft Icon können wir dem MenuItem-Steuerelement ein Icon zuordnen, welches links neben dem Titel angezeigt wird. Das Separator-Steuerelement kann ebenfalls dem Menu-Steuerelement untergeordnet werden und dient als Trennstrich.
Auch in WPF gibt es ein Kontextmenü, welches angezeigt wird, wenn mit der rechten Maustaste auf ein Steuerelement geklickt wird. Wurde ein solches Menü nicht deklariert, so wird es auch nicht angezeigt. Die Zuweisung des Kontextmenüs geschieht mit Hilfe der Eigenschaft ContextMenu. Vom Aufbau des Menüs ist das Kontextmenü gleich bzw. sehr ähnlich zum Hauptmenü. Auch dem Kontextmenü können MenuItem- und Separator-Elemente untergeordnet werden. Doch nochmals zurück zur Zuweisung: Wie können wir das ContextMenu- und die MenuItem-Elemente einem Steuerelement wie dem Button unterordnen? Als erstes machen wir aus dem Steuerelement ein zweiteiliges XML-Element und ordnen diesem das XML-Element Button.ContextMenu unter. Dadurch können wir auf die Eigenschaft per XAML zugreifen. Diesem Element wird nun das ContextMenu-Element untergeordnet.

MainWindow.xaml

<Menu VerticalAlignment="Top">
	<MenuItem Header="Datei">
		<MenuItem Header="Neu">
			<MenuItem Header="Textdokument" Click="menu_ItemClicked" />
			<MenuItem Header="Tabelle" Click="menu_ItemClicked" />
		</MenuItem>
		<MenuItem Header="Öffnen">
			<MenuItem Header="Textdokument" Click="menu_ItemClicked" />
			<MenuItem Header="Tabelle" Click="menu_ItemClicked" />
		</MenuItem>
		<MenuItem Header="Speichern" Click="menu_ItemClicked" />
		<Separator />
		<MenuItem Header="Beenden" Click="menu_ItemClicked" />
	</MenuItem>
	<MenuItem Header="Hilfe">
		<MenuItem Header="Hilfe öffnen" Click="menu_ItemClicked" />
		<Separator />
		<MenuItem Header="Info" Click="menu_ItemClicked" />
	</MenuItem>
</Menu>
<Button VerticalAlignment="Top" HorizontalAlignment="Left" Padding="5" Margin="40,40,0,0" Content="Bitte rechts klicken">
	<Button.ContextMenu>
		<ContextMenu>
			<MenuItem Name="menuItemMinimieren" Header="Minimieren" Click="contextMenu_ItemClicked" />
			<MenuItem Name="menuItemSchließen" Header="Schließen" Click="contextMenu_ItemClicked" />
		</ContextMenu>
	</Button.ContextMenu>
</Button>

MainWindow.xaml.cs
private void menu_ItemClicked(object sender, RoutedEventArgs e)
{
	MenuItem oMenuItem = (MenuItem)sender;
	MenuItem oMenuItemParent = (MenuItem)oMenuItem.Parent;

	if (oMenuItem.Header.ToString() == "Beenden")
		this.Close();
	else
	{
		// Prüfen ob übergeordnetes Element vom oMenuItemParent ein MenuItem ist (andernfalls exisitiert nur eine 2 teilige Hierarchie)
		if (oMenuItemParent.Parent is MenuItem)
			MessageBox.Show("Sie haben auf \"" + ((MenuItem)oMenuItemParent.Parent).Header + "\" -> \"" + oMenuItemParent.Header + "\" -> \"" + oMenuItem.Header + "\" geklickt!");
		else
			MessageBox.Show("Sie haben auf \"" + oMenuItemParent.Header + "\" -> \"" + oMenuItem.Header + "\" geklickt!");
	}
}

private void contextMenu_ItemClicked(object sender, RoutedEventArgs e)
{
	if (sender == menuItemMinimieren)
		this.WindowState = System.Windows.WindowState.Minimized;
	else
		this.Close();
}
Download

LinksRechts