<PackageReference Include="System.Reactive" Version="4.1.4" />

WindowsObservable

public static class WindowsObservable
Provides a set of static methods for importing typed events from Windows Runtime APIs.
using System.Reactive.Windows.Foundation; using Windows.Foundation; namespace System.Reactive.Linq { [CLSCompliant(false)] public static class WindowsObservable { public unsafe static IObservable<EventPattern<TSender, TResult>> FromEventPattern<TSender, TResult>(Action<TypedEventHandler<TSender, TResult>> addHandler, Action<TypedEventHandler<TSender, TResult>> removeHandler) { if (addHandler == null) throw new ArgumentNullException("addHandler"); if (removeHandler == null) throw new ArgumentNullException("removeHandler"); return Observable.Create<EventPattern<TSender, TResult>>(delegate { <>c__DisplayClass0_1<TSender, TResult> <>c__DisplayClass0_; TypedEventHandler<TSender, TResult> h = new TypedEventHandler<TSender, TResult>((object)<>c__DisplayClass0_, (IntPtr)(void*)); addHandler(h); return delegate { removeHandler(h); }; }); } public unsafe static IObservable<EventPattern<TSender, TResult>> FromEventPattern<TDelegate, TSender, TResult>(Func<TypedEventHandler<TSender, TResult>, TDelegate> conversion, Action<TDelegate> addHandler, Action<TDelegate> removeHandler) { if (conversion == null) throw new ArgumentNullException("conversion"); if (addHandler == null) throw new ArgumentNullException("addHandler"); if (removeHandler == null) throw new ArgumentNullException("removeHandler"); return Observable.Create<EventPattern<TSender, TResult>>(delegate { <>c__DisplayClass1_1<TDelegate, TSender, TResult> <>c__DisplayClass1_; TDelegate h = (TDelegate)conversion(new TypedEventHandler<TResult, ?>((object)<>c__DisplayClass1_, (IntPtr)(void*))); addHandler((TDelegate)h); return delegate { removeHandler((TDelegate)h); }; }); } public static IEventPatternSource<TSender, TEventArgs> ToEventPattern<TSender, TEventArgs>(this IObservable<EventPattern<TSender, TEventArgs>> source) { if (source == null) throw new ArgumentNullException("source"); return new EventPatternSource<TSender, TEventArgs>(source, (Action<Action<TSender, TEventArgs>, EventPattern<TSender, TEventArgs>>)delegate(Action<TSender, TEventArgs> h, EventPattern<TSender, TEventArgs> evt) { h(evt.Sender, evt.EventArgs); }); } public static IObservable<TResult> SelectMany<TSource, TResult>(this IObservable<TSource> source, Func<TSource, IAsyncOperation<TResult>> selector) { if (source == null) throw new ArgumentNullException("source"); if (selector == null) throw new ArgumentNullException("selector"); return source.SelectMany((TSource x) => AsyncInfoObservableExtensions.ToObservable<TResult>(selector(x))); } public static IObservable<TResult> SelectMany<TSource, TResult, TProgress>(this IObservable<TSource> source, Func<TSource, IAsyncOperationWithProgress<TResult, TProgress>> selector) { if (source == null) throw new ArgumentNullException("source"); if (selector == null) throw new ArgumentNullException("selector"); return source.SelectMany((TSource x) => AsyncInfoObservableExtensions.ToObservable<TResult, TProgress>(selector(x))); } public static IObservable<TResult> SelectMany<TSource, TAsyncOperationResult, TResult>(this IObservable<TSource> source, Func<TSource, IAsyncOperation<TAsyncOperationResult>> asyncOperationSelector, Func<TSource, TAsyncOperationResult, TResult> resultSelector) { if (source == null) throw new ArgumentNullException("source"); if (asyncOperationSelector == null) throw new ArgumentNullException("asyncOperationSelector"); if (resultSelector == null) throw new ArgumentNullException("resultSelector"); return source.SelectMany((TSource x) => AsyncInfoObservableExtensions.ToObservable<TAsyncOperationResult>(asyncOperationSelector(x)), resultSelector); } public static IObservable<TResult> SelectMany<TSource, TAsyncOperationResult, TAsyncOperationProgress, TResult>(this IObservable<TSource> source, Func<TSource, IAsyncOperationWithProgress<TAsyncOperationResult, TAsyncOperationProgress>> asyncOperationSelector, Func<TSource, TAsyncOperationResult, TResult> resultSelector) { if (source == null) throw new ArgumentNullException("source"); if (asyncOperationSelector == null) throw new ArgumentNullException("asyncOperationSelector"); if (resultSelector == null) throw new ArgumentNullException("resultSelector"); return source.SelectMany((TSource x) => AsyncInfoObservableExtensions.ToObservable<TAsyncOperationResult, TAsyncOperationProgress>(asyncOperationSelector(x)), resultSelector); } } }