Tray Applikation mit checked menuitems

Diggi

Mitglied
Hi,

ich habe mich mit einer Tray Applikation beschäftigt die ungefähr so aussieht:

C#:
        //Trayicon und Context-Menü
        private Icon mNetTrayIcon = new Icon("icon32.ico");
        private NotifyIcon NotifyIcon;
		private ContextMenu notifyiconMnu;
        
		private void Initializenotifyicon()
		{
            //Notify-icon einrichten
			NotifyIcon = new NotifyIcon();
			NotifyIcon.Icon = mNetTrayIcon;
			NotifyIcon.Text = "Tray Applikation";
			NotifyIcon.Visible = true;

			//Alle MenuItem Objekte in ein Array einfügen
			MenuItem[] mnuItms = new MenuItem[3];        
              
            //Menüeintrag 1
            mnuItms[0] = new MenuItem();
            mnuItms[0].Text = "Eintrag 1";
            mnuItms[0].Click += new System.EventHandler(this.Activate);
            mnuItms[0].DefaultItem = true;

            //Menüeintrag Trennlinie
            mnuItms[1] = new MenuItem("-");

            //Menüeintrag 2
            mnuItms[2] = new MenuItem();
            mnuItms[2].Text = "Exit";
            mnuItms[2].Click += new System.EventHandler(this.ExitSelect);
            mnuItms[2].DefaultItem = true;

            //MenuItems zum Context-Menü hinzufügen
			notifyiconMnu = new ContextMenu(mnuItms);
			NotifyIcon.ContextMenu = notifyiconMnu;
		}

        public void Activate(object sender, System.EventArgs e)
        {
             //Eintrag als checked markieren (geht nicht...)
             //mnuItms.Checked = true;
        }
        
        public void ExitSelect(object sender, System.EventArgs e)
		{
			//Trayicon verstecken
			NotifyIcon.Visible = false;
			//Beenden
			this.Close();
		}

Wie kann ich nun erreichen, dass über "Activate" das Menuitem als "Checked" dargestellt wird?
 
Nächstes Problem:
Wenn ich jetzt mehrere Menuitems habe, wie kann ich beim click auf ein Menuitem alle anderen deaktivieren (checked = false) ? :-(
 
Das kannst indem Du durch alle Menuitems des MenuItem.Parent durch iterierst.
Also so:
C#:
menuItem_Click(object sender, System.EventArgs e) {
	MenuItem item = (MenuItem) sender;

	item.Checked = !item.Checked;

	foreach ( MenuItem _menuItem in item.Parent.MenuItems ) {
		if ( !_menuItem.Equals( item ) )
			_menuItem.Checked = !item.Checked;
	}
}
 
Vielen Dank.
Ich habe das Projekt durch die hilfreichen Tipps beinahe abgeschlossen. :)
Jedoch ist jetzt noch ein Problem aufgetaucht für das ich keine Lösung finde:
Ich habe eine Autostart-Funktion integriert welche das Programm über einen Registry-Eintrag automatisch beim Systemstart ausführt.
Der Eintrag in die Registry wird auch problemlos ausgeführt. Jedoch bekomme ich beim starten von Windows die ungeliebte Fehlermeldung TrayApplication hat ein Problem festgestellt. :confused:
Meine Vermutung ist, dass dies am "NotifyIcon.Icon" liegt. Wenn ich die betroffenen Zeilen auskommentiere, erhalte ich keine Fehlermeldung (aber natürlich auch kein Icon :eek: ). Beim manuellen Start der Anwendung tritt dieser Fehler nicht auf und das Icon wird auch korrekt dargestellt.

Die Problemsignatur weist wohl auf eine nicht gefundene Datei hin:
EventType : clr20r3 P1 : TrayApplication.exe P2 : 1.0.0.0 P3 : 453dd63a
P4 : mscorlib P5 : 2.0.0.0 P6 : 4333ab80 P7 : 32f8 P8 : d8
P9 : system.io.filenotfoundexception
 
Morgen!

Hast Das Bild zu den Resourcen deines Forms hinzugefügt, oder lädtst das Bild von einem bestimmten Pfad?
Wenn Letzteres, dann musst den absoluten Pfad angeben, nicht nur den Dateinamen.
Kann sein das deine Anwendung während des Autostarts, einen anderen Arbeitspfad hat.
Ansonsten muss ich passen.
 
Wenn Du sagst das Du ein TrayApplication.ico in einem Ordner hast,
hast ja doch keines zu den Resourcen im Designer hinzugefügt.

Wenn Du ein Prgramm direkt aufrufst, ist der Arbeitspfad der des Programs.
Wenn der Prozess aber von einem anderen Prozess oder über eine Verküpfung aufgerufen wird,
ist der Arbeitspfad der des Prozesses oder der Verknüpfung. Bei Verknüpfungen kann man aber den Arbeitspfad einstellen.

Du hast anscheinend keinen absoluten Pfad zum Bild angegeben.
Den "Ort" deines Programs kannst mit Application.StartupPath herraus finden.

Ich würde Dir aber Empfehlen das Icon im Designer zu deinem TrayIcon hinzuzufügen.
 
Zurück