您可以使用反应式扩展。
查看Observable.FromEvent(或 Observable.FromEventPattern)方法将标准 .NET 事件转换为 observable,然后您可以使用Observable.CombineLatest对结果进行分组。
这是一个伪代码:
var observableA = Observable.FromEvent(yourEventA);
var observableB = Observable.FromEvent(yourEventB);
var observableG = observableA.CombineLatest(observableB, ...)
当两个事件都被触发时,就会触发生成的 observable。
编辑
CombineLatest
生成具有最新结果的输出,而不重置其状态。因此,例如,如果 A1 被触发,则 B1 被触发 G1 由 (A1 + B1) 产生,但如果 B2 被触发,则 G2 被 (A1 + B2) 产生,依此类推......
要准确产生您的预期结果,您可以编写如下内容:
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");
//}
基本上我检查最新结果是否与当前结果不同。也许您的情况有一些本机 RX 扩展,但我找不到它。