public EventToReactiveProperty3ViewModel() { // Throttleメソッドは指定した間、新たな値が発行されなかったら最後に発行された値を後続に流す var pushingSpanMsec = 300.0; /* * 一番最初に思い付いた実装。ダサい */ MouseDownUnit .Throttle(TimeSpan.FromMilliseconds(pushingSpanMsec)) .TakeUntil(MouseUpUnit) // ちょん押しを弾く .ObserveOnUIDispatcher() .Repeat() .Subscribe(_ => MouseLongPushing1.TurnOn()) .AddTo(CompositeDisposable); MouseUpUnit .Where(_ => MouseLongPushing1.Value) // Push中のみ解除判定 .Subscribe(_ => MouseLongPushing1.TurnOff()) .AddTo(CompositeDisposable); /* * Finally を使って、上の処理を一文に無理やりまとめた版。 * ReadOnlyReactiveProperty に出来ていないのが残念… */ MouseLongPushing2 = MouseDownUnit .Throttle(TimeSpan.FromMilliseconds(pushingSpanMsec)) .TakeUntil(MouseUpUnit) // ちょん押しを弾く .ObserveOnUIDispatcher() .Finally(() => MouseLongPushing2.Value = false) .Repeat() .Select(_ => true) .ToReactiveProperty() .AddTo(CompositeDisposable); /* * ◆ReadOnlyReactiveProperty を使って、一文にまとめられへんかなぁ… */ }
public EventToReactiveProperty1ViewModel() { PreviewMouseDownUnit .Select(_ => nameof(PreviewMouseDownUnit).Replace("Unit", "")) .Subscribe(x => { MouseEventCounter.PreviewMouseDownCounter++; NotifyPropertyChanged(nameof(MouseEventCounter)); }) .AddTo(CompositeDisposable); MouseDownUnit .Select(_ => nameof(MouseDownUnit).Replace("Unit", "")) .Subscribe(x => { MouseEventCounter.MouseDownCounter++; NotifyPropertyChanged(nameof(MouseEventCounter)); }) .AddTo(CompositeDisposable); MouseUpUnit .Select(_ => nameof(MouseUpUnit).Replace("Unit", "")) .Subscribe(x => { MouseEventCounter.MouseUpCounter++; NotifyPropertyChanged(nameof(MouseEventCounter)); }) .AddTo(CompositeDisposable); PreviewMouseUpUnit .Select(_ => nameof(PreviewMouseUpUnit).Replace("Unit", "")) .Subscribe(x => { MouseEventCounter.PreviewMouseUpCounter++; NotifyPropertyChanged(nameof(MouseEventCounter)); }) .AddTo(CompositeDisposable); }