Windows Forms: Menüs
In C# gibt es zwei verschiedene Arten von Menüs: das MenuStrip und das ContextMenuStrip. Ein Formular besitzt meistens ein MenuStrip, welches am oberen Fensterrand platziert ist. Bei kleineren Anwendungen ist eine solche Menüleiste oft auch nicht vorhanden. Einem Formular kann das (Haupt-)Menü über die Eigenschaft MainMenuStrip zugewiesen werden. Das ContextMenuStrip ist, wie der Name schon vermuten lässt, ein Kontextmenü, welches beim Rechtsklick auf ein Steuerelement angezeigt wird. Dafür muss bei dem Steuerelement, welchem das Kontextmenü zugewiesen werden soll, die Eigenschaft ContextMenuStrip gesetzt werden.
Beiden Menü-Arten können Steuerelemente der Klassen ToolStripMenuItem (vergleichbar mit Label), ToolStripTextBox (vergleichbar mit TextBox), ToolStripComboBox (vergleichbar mit ComboBox) und ToolStripSeparator (horizontale Linie zur Trennung) untergeordnet werden. Bei der Zusammenstellung eines Menüs ist uns der Designer eine große Hilfe. Ein Steuerelement der Klasse ToolStripMenuItem kann nach Belieben verschachtelt werden (siehe Beispiel).
Für das Event-Handling gibt es zwei verschiedene Ansätze: das ItemClicked-Event der MenuStrip- oder ContextMenuStrip-Klasse oder das Click-Event der einzelnen Tool-Strips. Das Problem des ItemClicked-Event ist, dass dieses Ereignis auch bei einem verschachtelten Item auftritt, was meistens jedoch nicht erwünscht ist. Das Problem des Click-Events eines einzelnen Tool-Strips ist, dass wir es bei allen Tool-Strips „manuell“ hinzufügen müssen. Im Beispiel haben wir uns für die einzelnen Click-Events entschieden. Über die Eigenschaft OwnerItem der Klasse ToolStripMenuItem können wir auf das übergeordnete Item zugreifen. Wenn kein übergeordnetes Item vorhanden ist bzw. keine Verschachtelung existiert, gibt die Eigenschaft null zurück.
Form1.cs
private void menuStripFenster_ItemClicked(object sender, EventArgs e) { ToolStripMenuItem oMenuItem = (ToolStripMenuItem)sender; ToolStripMenuItem oMenuItemParent = (ToolStripMenuItem)oMenuItem.OwnerItem; ToolStripMenuItem oMenuItemParentParent = (ToolStripMenuItem)oMenuItemParent.OwnerItem; // falls Beenden-ToolStrip angeklickt wurde, Fenster schließen if (oMenuItem == beendenToolStripMenuItem) Close(); // Ausgabe der geklickten Hierarchie (oMenuItemParentParent kann null sein, wenn Hierarchie nur aus 2 Elementen besteht) if (oMenuItemParentParent == null) MessageBox.Show("Sie haben auf \"" + oMenuItemParent.Text + "\" -> \"" + oMenuItem.Text + "\" geklickt!"); else MessageBox.Show("Sie haben auf \"" + oMenuItemParentParent.Text + "\" -> \"" + oMenuItemParent.Text + "\" -> \"" + oMenuItem.Text + "\" geklickt!"); } private void contextMenuStripButton_ItemClicked(object sender, EventArgs e) { if (sender == minimierenToolStripMenuItem) this.WindowState = FormWindowState.Minimized; else Close(); }