2009-08-09 4 views
3

Ich erstelle ein Kontextmenü, das eine Auflistung aller Ordner, Unterordner und Dateien in einem ausgewählten Ordner enthalten sollte. Ich möchte, dass das Menü die Dateien und Ordner öffnet, wenn sie angeklickt werden, aber das Klickereignis wird nicht registriert, wenn der Menüeintrag Unterpunkte hat.Get click-Ereignis auf einem Menüelement mit Unterelementen (C#)

Wie kann ich das Klickereignis auslösen, obwohl das Menüelement Unterelemente enthält?

Antwort

4

Es klingt wie ein Menü möglicherweise nicht das am besten geeignete UI-Widget hier. Ich glaube der Grund, warum Sie kein Klickereignis erhalten, ist, dass Menüpunkte mit Untermenüs nur sind, erweitern Sie ihre untergeordneten Elemente, wenn Sie darauf klicken, anstatt irgendeine andere Aktion auszuführen.

Das ist wahrscheinlich auch die Annahme des Benutzers.

Dieses Verhalten in der Dokumentation zu MenuItem.Click erwähnt wird:

Hinweis: Wenn die MenuItems Eigenschaft für die MenuItem alle Elemente enthält, dieses Ereignis wird nicht erhoben. Dieses Ereignis ist nicht ausgelöst für übergeordnete Menüelemente.

+0

Es soll eine kleine Anwendung, die Zugang gibt zu den meisten verwendeten Ordnern, Dateien, Websites usw. sehr leicht. Meine Idee ist ein Taskleistensymbol mit einem Rechtsklick-Menü, da ich keine anderen Steuerelemente sehen kann, die sowohl leicht zugänglich als auch versteckt sind, wenn sie nicht benutzt werden. Es gibt keine Möglichkeit, das Ereignis zu erhöhen, dann? –

+0

Ich glaube nicht, dass es einen Hacker gibt. Sie könnten jedoch unter jedem Verzeichnis einen "Blatt" -Menüeintrag mit dem Namen "[dieses Verzeichnis]" hinzufügen. Wie würden Sie den Unterschied zwischen einem Benutzer, der auf die Navigation klickt, und dem Klicken auf "Dieses Verzeichnis öffnen" erkennen? –

+0

Ja, der Menüeintrag "Blatt" ist die aktuelle Implementierung, aber ich mag es nicht sehr. Der Benutzer sollte nicht klicken müssen, um zu navigieren. Die Popup-Menüs sind automatisch (Doppelklick könnte eine Option sein, um Verwirrung zu vermeiden - wenn das Doppelklick-Ereignis unterstützt wurde). –

1

Wenn Sie Ihr Popup von einem Toolstrip gestartet haben, können Sie den Toolstrip ableiten und diesen Code hinzufügen.

override protected void OnItemClicked(ToolStripItemClickedEventArgs e) 
    { 
    if (this.Items.Count == 0) 
     base.OnItemClicked(e); 

    // else do nothing 
    } 

Die ContextMenu-Klasse verfügt jedoch nicht über OnItemClicked, aber onPopup. Ich habe versucht, es nicht, aber man könnte versuchen, die ContextMenu Subklassen

public class MyContextMenu : ContextMenu 
{ 
    override protected void OnPopUp(EventArgs e) 
    { 
     if (this.MenuItems.Count == 0) 
      base.OnPopUp(e); 

     // else do nothing 
    } 
} 

wenn das nicht funktioniert, dann könnten Sie die beiden Show Methoden außer Kraft setzen

public class MyContextMenu : ContextMenu 
{ 
    override protected void Show (Control c, Point p) 
    { 
     if (this.MenuItems.Count == 0) 
      base.Show (c, p) ; 

     // else do nothing 
    } 

    override protected void (Control c, Point p, LeftRightAlignment z) 
    { 
     if (this.MenuItems.Count == 0) 
      base.Show (c, p, z) ; 

     // else do nothing 
    } 
} 
+0

Ich bin mir nicht sicher, ob die Logik funktioniert, aber eine Darstellung ContextMenu Unterklasse und klicken Sie Ihre eigene Logik abfangen mit if (Artikel count> 0) zeigen Subitems sonst zeigen Abkürzung –