Beschreibung: DropDownMenu Control:
Hallo,
hier mein neues DropDownMenu Control. Erst mal ein Screenshot, weiteres folgt gleich ...
Schlagwörter: DropDownMenu, Menu, DropDown
Der Quellcode ist gründlichst dokumentiert. Hier eine kurze Zusammenfassung:
Was kann das Menu alles, bzw. was wird unterstützt:
Dropdown-Verhalten, also Auf- und Zuklappen von Hauptmenueinträgen
**Hover-Efekt **(Mouseover)
Berechtigungsabfragen (IDropDownMenu.HasPermission, XML-Attribute check-permission)
Resourcenunterstützung (Stichwort Mehrsprachigkeit, Attribute resource)
Registrierung von Eventhandler (DropDownMenu.EventHandlers.Add)
Instanzierung von registrierten Typen Diese werden geladen, wenn Menueintrag geklickt wird
Das Menu braucht als Input zum Rendern ein XML-File (Schema-File ist im Sourcecode dabei). Aus diesen Einträgen wird dann das Menu generiert:
Kurze Erklärung:
Hauptknoten Element menu
Attribut resource: Die Resource für die darzustellenden Texte, es kann nach der Resource ein Komma angegeben werden mit darauffolgendem Assemblynamen
Attribut width und color: .. is klar ... wobei bei color immer ein Hauptmenueintrag gemeint ist - die Submenus haben gegenwärtig immer die gleiche Farbe
Kindknoten Element entry
Attribut name: Hier kann der Menu-Text stehen und wenn resource angegeben (Element menu), denn ist dies der Key für die Resource
Attribut check-permission: Berechtigungen können abgefragt werden. Hier muss das Interface IDropDownMenu implementiert werden. Es wird dann die Methode HasPermission mit dem Namen (siehe Attribute name) aufgerufen. Hat ein Haupmenueintrag keine Berechtigung, wird das komplette dazugehörige Untermenu ausgeblendet, bzw. wenn für alle Untermenus keine Berechtigungen vorliegen, dann wird auch nicht der zugehörige Hauptmenueintrag angezeigt.
Attribute sub: Ob es sich um ein Subeintrag handelt oder nicht (man kann also einzeln oder komplett auf Untermenus verzichten)
Attribute type: Das ist der voll-qualifizierte Typ, ggf. mit Assemblyangabe, von welchem eine Instanz erstellt wird, nachdem der Eintrag geklickt wurde (kann auch für Hauptmenueinträge gelten, je nach dem, i.d.R. wird bei einem Hauptmenueintrag kein Typ angegeben, so dass das Menu nach einem Klick lediglich aufklappt)
Wie benutze ich das Teil:
Die Methode Render aufrufen, mit folgenden Parametern:
Voll-qualifizierter Name des XML-Input-Files,
Target-Control, zu diesem wird dann die Instanz, bei Klick auf einen Menueintrag mit konfiguriertem Typ (Element entry, Attribut type), geadded - dies ist i.d.R. ein Panel
und ggf. als dritten Parameter Objekt mit implementierten Interface IDropDownMenu (ist Pflicht, wenn bei mind. ein Eintrag check-permission gesetzt ist)
Für obige Farbbeispiele ist das demnach ein Einzeiler und sieht so aus:
this.dropDownMenu1.Render(this.qConfigFile, this.panelTest);
... that's it ...
In einem meiner Projekte sieht das dann so aus ...
... hier kann man zusätzlich noch Events benutzen und Eventhandler hinzufügen (zu den registrierten Typen, die reflektiert werden) ... in meinem Projekt sieht das dann so aus ...
// New DropDownMenu instance
this.dropDownMenu = new DropDownMenu();
// Add menu to menu panel
this.panelMenu.Controls.Add(this.dropDownMenu);
// Add event handler for message exchange
DropDownMenuEventHandler dropDownMenuEventHandler =
new DropDownMenuEventHandler("ExchangeMessage", "LogToConsole", this);
dropDownMenuEventHandler.InvokeMethodTypes = new Type[] { typeof(String),
typeof(Object), typeof(ConsoleLoggerConfig), typeof(bool) };
this.dropDownMenu.EventHandlers.Add(dropDownMenuEventHandler);
// Add event handler for exception exchange
dropDownMenuEventHandler = new DropDownMenuEventHandle("Exception", "HandleException", this);
this.dropDownMenu.EventHandlers.Add(dropDownMenuEventHandler);
// Menu control background color
this.dropDownMenu.BackColor = Color.Gainsboro;
// Add events
this.dropDownMenu.ContentChanged += new DropDownMenu.OnContentChanged(dropDownMenu_ContentChanged);
this.dropDownMenu.EventException += new DropDownMenu.OnEventException(dropDownMenu_EventException);
// TODO config file path via constant
this.dropDownMenu.Render(Application.StartupPath +
"/../../Config/Menu/menu.xml", this.panelContent);
That's it, für die ganze Anwendung, alle Aufgaben können so schön gekapselt in eigenen Usercontrols gecoded werden, diese werden dann einfach im XML-File als type angegeben und dann reflektiert ... anbei noch der Quellcode.
Gruß
Du hast das Testprojekt mit Visual Studio 2008 erstellt, oder? Kann es nämlich mit meiner 2005er Professionel Edition nicht öffnen: ".... wurde mit einer neueren Version dieser Anwendung erstellt und kann nicht geöffnet werden.". Solltest du erwähnen oder nochmal mit Visual Studio 2005 erstellen.
@Easyrider,
stimmt, habe ich vergessen zu erwähnen. Das Projekt ist mit 3.5 compiliert - sollte aber ohne weiteres auch mit 2.0 laufen, da keine 3.0 / 3.5 spezifischen Befehle verwendet werden.