Die Reihenfolge der Ausführung der Handler eines einzelnen Ereignisses kann nicht durch das Grundverhalten eines integrierten Ereignis selbst gesteuert werden. MulticastDelegates sind "Taschen" von Handlern, und sie greifen sie nur einzeln an. Denken Sie daran, dass dies von den meisten Entwicklern erwartet wird und dass es gefährlich sein kann, auftragsabhängige Ereignisbehandlungsroutinen zuzulassen. Event-Handler sollten normalerweise nicht voneinander wissen, denn wenn sie davon abhängig sind, vor oder nach einem anderen Handler ausgeführt zu werden, müssen sie zuerst von der Existenz des anderen Handlers wissen (Verletzung des Verbergens von Informationen und anderer Design-Prinzipien). Wenn sich diese Reihenfolge ändert, wird das Verhalten unterbrochen.
Wenn Sie all dies verstehen und trotzdem die Ausführungsreihenfolge von Handlern eines Ereignisses steuern möchten, kommen Sie mit folgenden Schritten in die Nähe.
- Erstellen Sie eine geordnete Sammlung von Delegaten des Ereignishandlertyps namens MyHandlers. Dies wird ein Surrogat für die MulticastDelegate-Implementierung des tatsächlichen Ereignisses sein.
- Erstellen Sie eine "Master" -Handlermethode, die tatsächlich an das integrierte Ereignis angehängt wird, und durch MyHandlers iterieren und jedes aufrufen.
- Definieren Sie einige Mittel zum Hinzufügen und Entfernen von Handlern aus der Liste. Einiges davon kann mit einer benutzerdefinierten Ereignis- "Eigenschaft" erreicht werden, aber das definiert nur Verhalten hinzufügen und entfernen, nicht einfügen.
Der Code könnte wie folgt aussehen:
private List<EventHandler> MyHandlers = new List<EventHandler>();
private void MasterClickHandler(object sender, EventArgs e)
{
foreach(var handler in MyHandlers)
handler(sender, e);
}
public event EventHandler MyControlButtonClick
{
add { MyHandlers.Add(value); }
remove { MyHandlers.Remove(value); }
}
public void InsertButtonClickHandler(EventHandler handler)
{
MyHandlers.Insert(handler,0); //calling this to add a handler puts the handler up front
}
...
myForm.MyControl.Click += MasterClickHandler;
Beachten Sie, dass Sie nicht mehr Handler andere als MasterClickHandler dem eigentlichen Ereignis Befestigung; Sie können Ihren Kuchen nicht essen und auch nicht essen, indem Sie das grundlegende Ereignisverhalten außer Kraft setzen und behalten.In das Ereignis "property" ist auch kein "insert" -Verhalten eingebaut; Sie müssen eine Methode definieren, die dies erlaubt. Schließlich sollten Sie das Ereignis MyControlButtonClick niemals direkt auslösen (obwohl Ihr Steuerelement das einzige ist, das dies kann, kann dies durch eine Codeüberprüfung erzwungen werden).
Nun, wenn Sie auf die Schaltfläche klicken, wird das Click-Ereignis in integrierten die Taste feuert MasterEventHandler, die die Delegierten in MyHandlers in der gleichen Reihenfolge ausgeführt werden diese auf MyControlButtonClick angebracht wurden (mit einer, der zuerst ausgeführt eingefügt wurden, in umgekehrter Reihenfolge wurden sie eingefügt). Wenn Sie diesen Code mit dem Button in ein benutzerdefiniertes Benutzersteuerelement eingefügt haben, könnten Sie sogar das benutzerdefinierte Ereignis auf Ihrem Steuerelement als Click bezeichnen. Das Steuerelement würde genauso aussehen und funktionieren wie der enthaltene Button, außer dass es zusätzliche Kontrolle über das Einfügen hätte Handler. Das Schöne an der ganzen Sache ist, dass nichts an diesem Code die Verbraucher dazu zwingt, mit ihr als etwas anderes als einem einfachen ol vanilla Event zu arbeiten.
+1 für den guten Rat. –