Exemplo n.º 1
0
        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()
        }
Exemplo n.º 2
0
        // 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));
        }
Exemplo n.º 3
0
        // 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));
        }
Exemplo n.º 4
0
        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()
        }
Exemplo n.º 5
0
 ///-------------------------------------------------------------------------------------------------
 /// <summary>
 ///  Default constructor.
 /// </summary>
 ///-------------------------------------------------------------------------------------------------
 public Subject()
 {
     _subject = new System.Reactive.Subjects.Subject <T>();
 }