101 lines
5.4 KiB
C#
101 lines
5.4 KiB
C#
|
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
|
|||
|
|
|||
|
#if HAS_WINRT
|
|||
|
using System.Threading;
|
|||
|
using Windows.Foundation;
|
|||
|
|
|||
|
namespace System.Reactive.Linq
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Provides a set of static methods for importing typed events from Windows Runtime APIs.
|
|||
|
/// </summary>
|
|||
|
public static partial class WindowsObservable
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Converts a typed event, conforming to the standard event pattern, to an observable sequence.
|
|||
|
/// </summary>
|
|||
|
/// <typeparam name="TSender">The type of the sender that raises the event.</typeparam>
|
|||
|
/// <typeparam name="TResult">The type of the event data generated by the event.</typeparam>
|
|||
|
/// <param name="addHandler">Action that attaches the given event handler to the underlying .NET event.</param>
|
|||
|
/// <param name="removeHandler">Action that detaches the given event handler from the underlying .NET event.</param>
|
|||
|
/// <returns>The observable sequence that contains data representations of invocations of the underlying typed event.</returns>
|
|||
|
/// <exception cref="ArgumentNullException"><paramref name="addHandler"/> or <paramref name="removeHandler"/> is null.</exception>
|
|||
|
/// <seealso cref="WindowsObservable.ToEventPattern"/>
|
|||
|
public 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>>(observer =>
|
|||
|
{
|
|||
|
var h = new TypedEventHandler<TSender, TResult>((sender, args) =>
|
|||
|
{
|
|||
|
observer.OnNext(new EventPattern<TSender, TResult>(sender, args));
|
|||
|
});
|
|||
|
|
|||
|
addHandler(h);
|
|||
|
|
|||
|
return () =>
|
|||
|
{
|
|||
|
removeHandler(h);
|
|||
|
};
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Converts a typed event, conforming to the standard event pattern, to an observable sequence.
|
|||
|
/// </summary>
|
|||
|
/// <typeparam name="TDelegate">The delegate type of the event to be converted.</typeparam>
|
|||
|
/// <typeparam name="TSender">The type of the sender that raises the event.</typeparam>
|
|||
|
/// <typeparam name="TResult">The type of the event data generated by the event.</typeparam>
|
|||
|
/// <param name="conversion">A function used to convert the given event handler to a delegate compatible with the underlying typed event. The resulting delegate is used in calls to the addHandler and removeHandler action parameters.</param>
|
|||
|
/// <param name="addHandler">Action that attaches the given event handler to the underlying .NET event.</param>
|
|||
|
/// <param name="removeHandler">Action that detaches the given event handler from the underlying .NET event.</param>
|
|||
|
/// <returns>The observable sequence that contains data representations of invocations of the underlying typed event.</returns>
|
|||
|
/// <exception cref="ArgumentNullException"><paramref name="conversion"/> or <paramref name="addHandler"/> or <paramref name="removeHandler"/> is null.</exception>
|
|||
|
/// <seealso cref="WindowsObservable.ToEventPattern"/>
|
|||
|
public 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>>(observer =>
|
|||
|
{
|
|||
|
var h = conversion(new TypedEventHandler<TSender, TResult>((sender, args) =>
|
|||
|
{
|
|||
|
observer.OnNext(new EventPattern<TSender, TResult>(sender, args));
|
|||
|
}));
|
|||
|
|
|||
|
addHandler(h);
|
|||
|
|
|||
|
return () =>
|
|||
|
{
|
|||
|
removeHandler(h);
|
|||
|
};
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Exposes an observable sequence as an object with a typed event.
|
|||
|
/// </summary>
|
|||
|
/// <typeparam name="TSender">The type of the sender that raises the event.</typeparam>
|
|||
|
/// <typeparam name="TEventArgs">The type of the event data generated by the event.</typeparam>
|
|||
|
/// <param name="source">Observable source sequence.</param>
|
|||
|
/// <returns>The event source object.</returns>
|
|||
|
/// <exception cref="ArgumentNullException"><paramref name="source"/> is null.</exception>
|
|||
|
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, (h, evt) => h(evt.Sender, evt.EventArgs));
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
#endif
|