Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
DropDownMenu Control
mosspower
myCSharp.de - Member

Avatar #avatar-2662.jpg


Dabei seit:
Beiträge: 456
Herkunft: Bamberg

Themenstarter:

DropDownMenu Control

beantworten | zitieren | melden

Beschreibung: DropDownMenu Control:

Hallo,

hier mein neues DropDownMenu Control. Erst mal ein Screenshot, weiteres folgt gleich ...

Schlagwörter: DropDownMenu, Menu, DropDown
Attachments
private Nachricht | Beiträge des Benutzers
mosspower
myCSharp.de - Member

Avatar #avatar-2662.jpg


Dabei seit:
Beiträge: 456
Herkunft: Bamberg

Themenstarter:

beantworten | zitieren | melden

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 ...
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von mosspower am .
Attachments
private Nachricht | Beiträge des Benutzers
mosspower
myCSharp.de - Member

Avatar #avatar-2662.jpg


Dabei seit:
Beiträge: 456
Herkunft: Bamberg

Themenstarter:

beantworten | zitieren | melden

... 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ß
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von mosspower am .
Attachments
private Nachricht | Beiträge des Benutzers
Easyrider
myCSharp.de - Member



Dabei seit:
Beiträge: 200
Herkunft: Bayern

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
mosspower
myCSharp.de - Member

Avatar #avatar-2662.jpg


Dabei seit:
Beiträge: 456
Herkunft: Bamberg

Themenstarter:

beantworten | zitieren | melden

@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.
private Nachricht | Beiträge des Benutzers