Heim >Backend-Entwicklung >C++ >Können Ereignishandler programmgesteuert zwischen Steuerelementen in Windows Forms übertragen werden?
Können Event-Handler zwischen Steuerelementen übertragen werden?
Es besteht die Möglichkeit, einen Event-Handler von einem Steuerelement zu „stehlen“ und einem anderen zuzuweisen ist seit Jahren ein Diskussionsthema in der Programmiergemeinschaft. Obwohl die in der Frage vorgeschlagene Syntax ungültig ist, ist es technisch tatsächlich möglich, Ereignishandler zur Laufzeit zwischen Steuerelementen zu übertragen.
The Reflection Route
Aufgrund der privaten und Aufgrund der internen Natur bestimmter Mitglieder innerhalb des Windows Forms-Frameworks ist eine Reflexion erforderlich, um dieses Kunststück zu erreichen. Durch die Nutzung von Reflection können Sie auf private Felder und Eigenschaften zugreifen, auf die sonst nicht zugegriffen werden könnte.
Im bereitgestellten Codebeispiel wird eine Reihe von Reflection-Operationen ausgeführt:
Dadurch wird der Event-Handler effektiv von Button1 auf Button2 übertragen.
Implementierungsbeispiel
Hier ist eine überarbeitete Version des im bereitgestellten Codes Frage:
using System; using System.ComponentModel; using System.Windows.Forms; using System.Reflection; namespace EventHandlerTransfer { public partial class Form1 : Form { public Form1() { InitializeComponent(); button1.Click += new EventHandler(button1_Click); TransferEventHandler(button1, button2); } private void TransferEventHandler(Control source, Control destination) { // Get secret click event key FieldInfo eventClick = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static); object secret = eventClick.GetValue(null); // Retrieve the click event PropertyInfo eventsProp = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance); EventHandlerList eventsSource = (EventHandlerList)eventsProp.GetValue(source, null); EventHandlerList eventsDestination = (EventHandlerList)eventsProp.GetValue(destination, null); Delegate click = eventsSource[secret]; // Remove it from source, add it to destination eventsSource.RemoveHandler(secret, click); eventsDestination.AddHandler(secret, click); } void button1_Click(object sender, EventArgs e) { MessageBox.Show("Yada"); } } }
Fazit
Obwohl die Möglichkeit, Event-Handler auf diese Weise zu übertragen, wie eine leistungsstarke Funktion erscheinen mag, sollte sie mit Vorsicht verwendet werden. Diese Technik basiert stark auf Reflexion, was Auswirkungen auf die Leistung haben und auch potenzielle Fehler verursachen kann. Darüber hinaus wird das Ändern privater Mitglieder des Windows Forms-Frameworks nicht empfohlen, da dies Ihre Anwendung beschädigen kann, wenn in zukünftigen Versionen des Frameworks Änderungen vorgenommen werden.
Das obige ist der detaillierte Inhalt vonKönnen Ereignishandler programmgesteuert zwischen Steuerelementen in Windows Forms übertragen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!