/// <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(); })); }