Beispiel #1
0
        /// <summary>
        /// マウスイベントの開始
        /// </summary>
        /// <param name="target">イベント発生元コントロール</param>
        /// <param name="button">ドラッグイベントに対応するマウスボタン</param>
        public void Start(Control target, MouseButtons button)
        {
            IDraggable active = this.DefaultItem;

              //ボタンが押されていない間のマウスムーブイベント
              this.Disposables.Add(
            target.MouseMoveAsObservable()
              .Where(e => e.Button == MouseButtons.None)
              .Subscribe(
              e =>
              {
            //選択中のオブジェクトを先行してチェック
            active = SelectedItems.HitTest(e.Location);
            if (active != null)
            {
              target.Cursor = active.Cursor;
              return;
            }

            //カーソルの下にあるm_shapes内のオブジェクトをactiveに設定する。
            //オブジェクトのない場所にカーソルがある場合はDefaultItemがActiveとなる。
            active = DefaultItem;

            foreach (IDraggable item in Items.Reverse<IDraggable>())
            {
              var result = item.HitTest(e.Location);
              if (result != null)
              {
                active = result;
                break;
              }
            };
            target.Cursor = active.Cursor;
              }));

              //マウスダウンイベント
              this.Disposables.Add(
            target.MouseDownAsObservable()
              .Subscribe(
              e =>
              {
            var act = active as ISelectable;
            if (act != null && !act.IsSelected)
            {
              foreach (ISelectable item in this.Selectables)
              {
                item.IsSelected = item == act;
              }
              this.SelectedItems = new CompositeDraggable(Enumerable.Empty<IDraggable>());
              target.Refresh();
            };
              }));

              //ドラッグイベント
              this.Disposables.Add(
            target.MouseDragAsObservable(button)
              .Subscribe(
              e =>
              {
            active.Drag(e);
            target.Refresh();
              }));

              //マウスアップイベント
              this.Disposables.Add(
             target.MouseUpAsObservable()
               .Subscribe(
               e =>
               {
             var item = active.Drop();
             if (item != null)
               this.AddItem(item);
             target.Refresh();
               }));
        }