Ich habe vor kurzem angefangen, mehr über Ereignisse/Delegaten in Verbindung mit Erweiterungen zu einer Klasse zu lernen.C#: abgeleitete Klassen als generischer Parameter übergeben
wollte ich setzen, was ich in die Praxis gelernt eine SetDraggable()
genannt Erweiterung Methode, um Windows Form durch Hinzufügen von Steuerelementen, die wiederum ein MouseDown
und MouseMove
Ereignisse verwendet die Steuerung zu bewegen.
Alles funktioniert gut, bis auf die Idee, dass es nur für ein bestimmtes Steuerelement gilt - in meinem Fall eine Button
.
namespace Form_Extensions
{
public static class Extensions
{
private static System.Windows.Forms.Button StubButton;
private static Point MouseDownLocation;
public static void SetDraggable(this System.Windows.Forms.Button b)
{
b.MouseDown += b_MouseDown;
b.MouseMove += b_MouseMove;
StubButton = b;
}
private static void b_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
MouseDownLocation = e.Location;
}
}
static void b_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
StubButton.Left = e.X + StubButton.Left - MouseDownLocation.X;
StubButton.Top = e.Y + StubButton.Top - MouseDownLocation.Y;
}
}
}
}
Wie man sehen kann, muss ich die spezifische Steuerung, um die Mausereignisse nennen - ich kann diese Ereignisse nicht zugreifen aus dem Eltern Klasse System.Windows.Forms
.
Also meine Frage bleibt - gibt es ein Konzept, das Programmierer generisch alle abgeleiteten Klassen als Argument übergeben können. Ich versuche grundsätzlich zu vermeiden, den folgenden Code für jede einzelne Kontrolle einzufügen und möchte ihn für alle von System.Windows.Forms
abgeleiteten Klassen verallgemeinern.
Soweit ich sagen kann, ist der Hauptfehler in dieser Idee die Tatsache, dass ich NAHME bin, dass alle abgeleiteten Klassen das Ereignis muss ich haben; Da jedoch eine ähnliche Funktion für Funktionen in Form von Delegaten existiert, hatte ich gehofft, jemand könnte für Fälle mit Objekten oder Parameter einwiegen.
Die Elternklasse nicht 'System.Windows.Forms' ist, das ist einfach der Namespace. Die Elternklasse ist 'Control', und Sie können das sicher verwenden :) Eine generische Methode ist ebenfalls möglich, aber nicht wirklich notwendig. Im Idealfall sollten Sie diese statischen Felder auch vermeiden, da mehrere gleichzeitige ziehbare Elemente möglich sind. Eine Schließung in der 'SetControlDraggable' Methode wird viel besser funktionieren. Oder benutze einfach 'sender', das ist wirklich was es ist :) – Luaan