Laden...

Funktionssammlung für Controls erstellen

Erstellt von Frokuss vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.231 Views
F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 4 Jahren
Funktionssammlung für Controls erstellen

Guten Tag zusammen 😃

Ich hoffe ihr alle hattet schöne sonnige Ostertage?!

Ich würde gerne eine Sammlung von verschiedenen Funktionen für Controls erstellen - allerdings habe ich keine Ahnung wie ich das machen soll 😦 Was genau meine ich nun aber damit?

Ich habe mir meinen eigenen Control erstellt (erbt von nem Label) und habe dort ein Hoverevent erstellt. Nun möchte ich aber, dass dieses Event auch für ein geerbtes Panel verfügbar ist...

Den Code habe ich bisher noch nicht ausgeführt, da ich das Projekt komplett neuanfange und mit neuen Ideen füttern will:

	public class ListElement : Label{
		//Konstruktor hierfür nicht relevant...
		//...

		private void SetHoverEffekt(){
			if(styleEffekt.hover){
				base.MouseEnter += new EventHandler(HoverEffectIn);
				base.MouseLeave += new EventHandler(HoverEffectOut);
			}
			else{
				base.MouseEnter -= HoverEffectIn;
				base.MouseLeave -= HoverEffectOut;
			}
		}
		
		private void HoverEffectIn(object sender, EventArgs evt){
			this.BackColor = Color.LightGray;//Bsp.
		}
		
		private void HoverEffectOut(object sender, EventArgs evt){
			this.BackColor = Color.White;//Bsp.
		}
	}

Wie müsste/könnte ich diese drei Funktionen geschickt auslagern, so dass diese für alle Controls zur Verfügung stehen?

Vom Gundgedanken irgendetwas in diese Richtung (Pseudo-Code):

public static FormEffektSammlung{
	public static void SetHoverEffekt(){
		//...
	}
	//hier noch die anderen Methoden (als private static)...
}

Und den Aufruf in der Klasse quasi in diese Richtung:

this.SetHoverEffekt();

Aber wie gesagt... keine Ahnung ob das irgendwie so möglich ist, wie ich mir das Vorstelle, oder ob ich auf jeden Fall den Control als Parameter übergeben muss...

Hoffe ihr könnt mir da weiterhelfen 😃 Gruß
Frokuss

PS: bin noch nicht so vertraut mit den ganzen private, public, static, protected.... Nur so um groben ^^

4.938 Beiträge seit 2008
vor 4 Jahren

Da kannst du eine (statische) Methode erstellen, welche das Control als Parameter enthält:


public static void SetHoverEffekt(Control control, bool hover)
{
    if (hover)
    {
        control.MouseEnter += HoverEffectIn;
        control.MouseLeave += HoverEffectOut;
    }
    else
    {
        control.MouseEnter -= HoverEffectIn;
        control.MouseLeave -= HoverEffectOut;
    }
}

Solange du nicht explizit auf protected-Member zugreifen mußt, benötigst du keine Ableitung.

Wenn du den kompletten Code in eine statische Klasse auslagerst, dann kannst du daraus sogar eine Erweiterungsmethode machen:


public static void SetHoverEffekt(this Control control)
{
    //
}

Und dann explizit für jedes Control diese SetHoverEffect-Methode aufrufen.

Edit:
Ein andere Möglichkeit wäre ein generisches Control á la


public class HoverControl<TControl> : TControl

Und dann entweder spezielle Controlklassen erzeugen:


public class HoverLabel : HoverControl<Label>
{
}

oder aber direkt ein Control davon erzeugen:


HoverControl<Label> hoverLabel = new HoverControl<Label>();

16.830 Beiträge seit 2008
vor 4 Jahren

Flexibler ist wäre in diesem Fall Reactive Extensions oder MediatR.
D.h. Du wirfst Events und kannst dann entkoppelt darauf reagieren.

F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 4 Jahren

Cool 😃 Vielen lieben dank 😃

Wobei dieses Reactive Extensions wohl aktuell noch ein wenig mit Kanonen auf Spazen schießen für mich ist... Und da muss ich mich erst intensiv reinfuchsen...

Habs jetzt wie in einem ersten Post geregelt:

	public static class FormSammlung{
		public static void SetHoverEffekt(Label c, bool hover){SetHoverEffekt((Control)c, hover);}
		public static void SetHoverEffekt(Panel c, bool hover){SetHoverEffekt((Control)c, hover);}
		public static void SetHoverEffekt(Control c, bool hover){
			if(hover){
				c.MouseEnter += new EventHandler(HoverEffectIn);
				c.MouseLeave += new EventHandler(HoverEffectOut);
			}
			else{
				c.MouseEnter -= HoverEffectIn;
				c.MouseLeave -= HoverEffectOut;
			}
		}
		
		private static void HoverEffectIn(object sender, EventArgs evt){
			Control c =(Control)sender;
			c.BackColor = Color.LightGray;
		}
		
		private static void HoverEffectOut(object sender, EventArgs evt){
			Control c =(Control)sender;
			c.BackColor = Color.White;
		}
	}

16.830 Beiträge seit 2008
vor 4 Jahren

Brauchst nur nen EventAggregator. Sind vielleicht 15 Zeilen Code.

4.938 Beiträge seit 2008
vor 4 Jahren

Deine beiden überladenen Methoden für Label und Panel kannst du weglassen, da sie ja selbst von Control abgeleitet sind, also automatisch die Methode mit dem Control-Parameter aufgerufen wird (das ist ja eines der Grundprinzipien der OOP).

F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 4 Jahren

@Abt: Muss ich mir mal überlegen, ob ich mir das angucken werde - aber wird wohl nicht Zeitnah geschehen... Trotzdem danke 😃

@Th69: Oh, danke. Das war mir (wie du erkannt hast 😄) nicht klar ^^ Danke!

Gruß Frokuss