public MainWindow() { InitializeComponent(); //----- Canvas 上の Mouse 位置を textBlk に表示 ------------------ Observable.FromEventPattern<MouseEventArgs>(this.Canvas, "MouseMove") .Do(_ => this.textBlk1.Text = null) .Select(pattern => pattern.EventArgs.GetPosition(this)) /* ポジションを絞り込みたいときは以下 */ /*.Where(position => (position.X > this.Canvas.ActualWidth / 2) && (position.Y > this.Canvas.ActualHeight / 2))*/ .Subscribe(position => this.textBlk1.Text = string.Format("(X, Y) = {0}", position)); //----- Canvas に Mouse で線を引く処理の設定 --------------------- // MouseMoveEvent を Mouse一に変換 var mv = Observable. FromEventPattern<MouseEventArgs>(this.Canvas, "MouseMove").Select(x => x.EventArgs.GetPosition(null)); // Mouse位置に変換したものを直前値とペアで合成 mv.Zip(mv.Skip(1), Tuple.Create) // 合成したものを Downは Skipし、Upは Take // skipUntil は OnNext などの Event発生するまで skipされる? .SkipUntil(Observable.FromEventPattern(this.Canvas, "MouseDown")) .TakeUntil(Observable.FromEventPattern(this.Canvas, "MouseUp")) .Repeat() // 上記処理を繰り返す // Mouse位置を線に変換 .Select(x => new Line { X1 = x.Item1.X, Y1 = x.Item1.Y, X2 = x.Item2.X, Y2 = x.Item2.Y, Stroke = Brushes.White, StrokeThickness = 3 }) .Subscribe(x => this.Canvas.Children.Add(x)); // 描画 //--- 以下参考集 ---------------------------------------------------------------- // Tupleの参考。 1, 2, 3 と出力される //var tupleData1 = Tuple.Create<int, int, int>(1, 2, 3); //Console.WriteLine(tupleData1.Item1); //Console.WriteLine(tupleData1.Item2); //Console.WriteLine(tupleData1.Item3); // Skip と Take 参考。 var sb = new System.Reactive.Subjects.Subject<int>(); // 最初の3つをスキップして、その後3つを通知する sb.Skip(3).Take(3).Subscribe( i => Console.WriteLine("OnNext({0})", i), ex => Console.WriteLine("OnError({0})", ex.Message), () => Console.WriteLine("OnCompleted()")); // 1-10の値を流し込む Observable.Range(1, 10).ForEach(i => sb.OnNext(i)); // 出力結果は以下 // OnNext(4) // OnNext(5) // OnNext(6) // OnCompleted() }
// Reactive の機能をいろいろ試すボタン private void button_Click(object sender, RoutedEventArgs e) { // 偶数で Event発生 Observable.Range(0, 10).Where(x => 0 == x % 2).Subscribe(rcvEv); // 10秒後に Event発生 int i = 10; System.Reactive.Linq.Observable.Return(i).Delay(TimeSpan.FromSeconds(10)).Subscribe(rcvEv); // 始めの3回のみ Event System.Reactive.Linq.Observable.Range(0, 10).Take(3).Subscribe(rcvEv); // Subject を使って Observerパターン var o = new System.Reactive.Subjects.Subject <string>(); o.Subscribe(x => Console.WriteLine(x)); o.OnNext(DateTime.Now.ToString("HH:mm:ss")); // 変更を通知 // Where でフィルタリング var si = new System.Reactive.Subjects.Subject <int>(); si.Where(x => x % 2 == 0).Subscribe( x => MessageBox.Show(string.Format("OnNext: {0}", x)), () => MessageBox.Show("OnCompleted") ); si.OnNext(2); si.OnCompleted(); // Where で絞りこみ、Select で変換 var si2 = new System.Reactive.Subjects.Subject <int>(); si2.Where(x => x % 2 == 0).Select(x => x * 2).Subscribe( x => MessageBox.Show(string.Format("OnNext: {0}", x)), () => MessageBox.Show("OnCompleted") ); si2.OnNext(1); si2.OnNext(2); // 非同期処理 5秒後の時間を取得し、MsgBox に表示 Observable.FromAsync(() => GetDayTime("After5sec=")).Subscribe(x => msgBox(x)); }
// Reactive の機能をいろいろ試すボタン private void button_Click(object sender, RoutedEventArgs e) { // 偶数で Event発生 Observable.Range(0, 10).Where(x => 0 == x % 2).Subscribe(rcvEv); // 10秒後に Event発生 int i = 10; System.Reactive.Linq.Observable.Return(i).Delay(TimeSpan.FromSeconds(10)).Subscribe(rcvEv); // 始めの3回のみ Event System.Reactive.Linq.Observable.Range(0, 10).Take(3).Subscribe(rcvEv); // Subject を使って Observerパターン var o = new System.Reactive.Subjects.Subject<string>(); o.Subscribe(x => Console.WriteLine(x)); o.OnNext(DateTime.Now.ToString("HH:mm:ss")); // 変更を通知 // Where でフィルタリング var si = new System.Reactive.Subjects.Subject<int>(); si.Where(x => x % 2 == 0).Subscribe( x => MessageBox.Show(string.Format("OnNext: {0}", x)), () => MessageBox.Show("OnCompleted") ); si.OnNext(2); si.OnCompleted(); // Where で絞りこみ、Select で変換 var si2 = new System.Reactive.Subjects.Subject<int>(); si2.Where(x => x % 2 == 0).Select(x => x * 2).Subscribe( x => MessageBox.Show(string.Format("OnNext: {0}", x)), () => MessageBox.Show("OnCompleted") ); si2.OnNext(1); si2.OnNext(2); // 非同期処理 5秒後の時間を取得し、MsgBox に表示 Observable.FromAsync(() => GetDayTime("After5sec=")).Subscribe(x => msgBox(x)); }
public MainWindow() { InitializeComponent(); //----- Canvas 上の Mouse 位置を textBlk に表示 ------------------ Observable.FromEventPattern <MouseEventArgs>(this.Canvas, "MouseMove") .Do(_ => this.textBlk1.Text = null) .Select(pattern => pattern.EventArgs.GetPosition(this)) /* ポジションを絞り込みたいときは以下 */ /*.Where(position => (position.X > this.Canvas.ActualWidth / 2) && * (position.Y > this.Canvas.ActualHeight / 2))*/ .Subscribe(position => this.textBlk1.Text = string.Format("(X, Y) = {0}", position)); //----- Canvas に Mouse で線を引く処理の設定 --------------------- // MouseMoveEvent を Mouse一に変換 var mv = Observable. FromEventPattern <MouseEventArgs>(this.Canvas, "MouseMove").Select(x => x.EventArgs.GetPosition(null)); // Mouse位置に変換したものを直前値とペアで合成 mv.Zip(mv.Skip(1), Tuple.Create) // 合成したものを Downは Skipし、Upは Take // skipUntil は OnNext などの Event発生するまで skipされる? .SkipUntil(Observable.FromEventPattern(this.Canvas, "MouseDown")) .TakeUntil(Observable.FromEventPattern(this.Canvas, "MouseUp")) .Repeat() // 上記処理を繰り返す // Mouse位置を線に変換 .Select(x => new Line { X1 = x.Item1.X, Y1 = x.Item1.Y, X2 = x.Item2.X, Y2 = x.Item2.Y, Stroke = Brushes.White, StrokeThickness = 3 }) .Subscribe(x => this.Canvas.Children.Add(x)); // 描画 //--- 以下参考集 ---------------------------------------------------------------- // Tupleの参考。 1, 2, 3 と出力される //var tupleData1 = Tuple.Create<int, int, int>(1, 2, 3); //Console.WriteLine(tupleData1.Item1); //Console.WriteLine(tupleData1.Item2); //Console.WriteLine(tupleData1.Item3); // Skip と Take 参考。 var sb = new System.Reactive.Subjects.Subject <int>(); // 最初の3つをスキップして、その後3つを通知する sb.Skip(3).Take(3).Subscribe( i => Console.WriteLine("OnNext({0})", i), ex => Console.WriteLine("OnError({0})", ex.Message), () => Console.WriteLine("OnCompleted()")); // 1-10の値を流し込む Observable.Range(1, 10).ForEach(i => sb.OnNext(i)); // 出力結果は以下 // OnNext(4) // OnNext(5) // OnNext(6) // OnCompleted() }
///------------------------------------------------------------------------------------------------- /// <summary> /// Default constructor. /// </summary> ///------------------------------------------------------------------------------------------------- public Subject() { _subject = new System.Reactive.Subjects.Subject <T>(); }