public ReactiveMediaManager() { var bufferObservable = Observable.FromEventPattern <BufferingChangedEventHandler, BufferingChangedEventArgs>( h => CrossMediaManager.Current.BufferingChanged += h, h => CrossMediaManager.Current.BufferingChanged -= h) .Select(pattern => pattern.EventArgs); BufferedTime = bufferObservable.Select(e => e.BufferedTime); BufferedProgress = bufferObservable.Select(e => e.BufferProgress); PlaybackState = Observable.FromEventPattern <StatusChangedEventHandler, StatusChangedEventArgs>( h => CrossMediaManager.Current.StatusChanged += h, h => CrossMediaManager.Current.StatusChanged -= h) .Select(pattern => pattern.EventArgs.Status); var playingObservable = Observable.FromEventPattern <PlayingChangedEventHandler, PlayingChangedEventArgs>( h => CrossMediaManager.Current.PlayingChanged += h, h => CrossMediaManager.Current.PlayingChanged -= h) .Select(pattern => pattern.EventArgs); PlaybackDuration = playingObservable.Select(e => e.Duration); PlaybackPosition = playingObservable.Select(e => e.Position); PlaybackProgress = playingObservable.Select(e => e.Progress); IsPlaying = PlaybackState.Select(status => status == MediaPlayerStatus.Playing); MediaFinished = Observable.FromEventPattern <MediaFinishedEventHandler, MediaFinishedEventArgs>( h => CrossMediaManager.Current.MediaFinished += h, h => CrossMediaManager.Current.MediaFinished -= h) .Select(e => e.EventArgs.File); MediaFailed = Observable.FromEventPattern <MediaFileFailedEventHandler, MediaFailedEventArgs>( h => CrossMediaManager.Current.MediaFileFailed += h, h => CrossMediaManager.Current.MediaFileFailed -= h) .Select(e => e.EventArgs); MediaFileChanged = Observable.FromEventPattern <MediaFileChangedEventHandler, MediaFileChangedEventArgs>( h => CrossMediaManager.Current.MediaFileChanged += h, h => CrossMediaManager.Current.MediaFileChanged -= h) .Select(e => e.EventArgs.File); QueueEnded = Observable.FromEventPattern <QueueEndedEventHandler, QueueEndedEventArgs>( h => CrossMediaManager.Current.MediaQueue.QueueEnded += h, h => CrossMediaManager.Current.MediaQueue.QueueEnded -= h) .Select(e => true); ActiveItemInQueue = Observable.FromEventPattern <QueueMediaChangedEventHandler, QueueMediaChangedEventArgs>( h => CrossMediaManager.Current.MediaQueue.QueueMediaChanged += h, h => CrossMediaManager.Current.MediaQueue.QueueMediaChanged -= h) .Select(e => e.EventArgs.File); QueueChanged = Observable .FromEventPattern <NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>( h => CrossMediaManager.Current.MediaQueue.CollectionChanged += h, h => CrossMediaManager.Current.MediaQueue.CollectionChanged -= h) .Select(e => e.EventArgs); }