Vous pouvez utiliser Extensions réactives .
Regardez le Observable.FromEvent (ou Observable.FromEventPattern) pour convertir un événement .NET standard en observable, puis vous pouvez regrouper les résultats à l'aide des méthodes suivantes Observable.CombineLatest .
Voici un pseudo-code :
var observableA = Observable.FromEvent(yourEventA);
var observableB = Observable.FromEvent(yourEventB);
var observableG = observableA.CombineLatest(observableB, ...)
L'observable généré est déclenché lorsque les deux événements sont déclenchés.
EDIT
CombineLatest
produire une sortie avec les derniers résultats, sans remettre son état à zéro. Donc par exemple si A1 est tiré puis B1 est tiré G1 est produit avec (A1 + B1), mais si B2 est tiré alors G2 est produit avec (A1 + B2) et ainsi de suite...
Pour produire exactement les résultats attendus, vous pouvez écrire quelque chose comme :
private void SetupEvents()
{
var observableA = Observable.FromEventPattern((e) => btA.Click += e, (e) => btA.Click -= e);
var observableB = Observable.FromEventPattern((e) => btB.Click += e, (e) => btB.Click -= e);
EventPattern<object> lastA = null;
EventPattern<object> lastB = null;
var observableG = observableA.CombineLatest(observableB, (rA, rB) =>
{
if (lastA == rA || lastB == rB)
return null;
lastA = rA;
lastB = rB;
return new Tuple<EventPattern<object>, EventPattern<object>>(rA, rB);
}).Where(p => p != null);
observableG.Subscribe(r => Trace.WriteLine("A + B"));
// or use ToEvent to generate another standard .NET event
//observableG.ToEvent().OnNext += GEvent;
}
//void GEvent(System.Reactive.EventPattern<object> obj)
//{
// Trace.WriteLine("A + B");
//}
En gros, je vérifie si les derniers résultats sont différents du résultat actuel. Peut-être existe-t-il une extension native de RX pour votre cas mais je ne la trouve pas.