/// LayoutEditImage: MouseMove
        /// @param sender 使用しない
        /// @param e Client座標系でのマウス座標(GetPosition(...))の取得が可能
        private void LayoutEditImage_MouseMove(object sender, MouseEventArgs e)
        {
            // 前処理
            var image = (IInputElement)sender;
            var relativeMousePoint = this.GetRelativeMousePoint(image, e);

            // 動作中でなければカーソルを変更するだけ
            if (!this.moveAndSize.IsRunning)
            {
                LayoutElement hitElement;
                HitModes      hitMode;
                HitTest.TryHitTest(App.Profile, relativeMousePoint, out hitElement, out hitMode);
                this.Cursor = LayoutEdit.HitModesToCursors[hitMode];
                return;
            }

            // Move or Size
            this.moveAndSize.MousePoint = relativeMousePoint;
            var nextLTRB = this.moveAndSize.Do(Keyboard.Modifiers == ModifierKeys.Shift);

            App.Profile.Current.BoundRelativeLeft   = nextLTRB.Left;
            App.Profile.Current.BoundRelativeTop    = nextLTRB.Top;
            App.Profile.Current.BoundRelativeRight  = nextLTRB.Right;
            App.Profile.Current.BoundRelativeBottom = nextLTRB.Bottom;

            // 描画自体はCompositionTarget.Renderingで行う
        }
        //-------------------------------------------------------------------

        /// LayoutEditImage: MouseDown
        /// @param sender 使用しない
        /// @param e Client座標系でのマウス座標(GetPosition(...))の取得が可能
        private void LayoutEditImage_MouseDown(object sender, MouseButtonEventArgs e)
        {
            // マウス操作中にアプリケーションからフォーカスが外れた場合に対応
            if (this.moveAndSize.IsRunning)
            {
                return;
            }

            // 左/右クリック以外はすぐに戻る
            if (e.ChangedButton != MouseButton.Left && e.ChangedButton != MouseButton.Right)
            {
                return;
            }

            // 前処理
            var image = (IInputElement)sender;
            var relativeMousePoint = this.GetRelativeMousePoint(image, e);

            // HitTest
            LayoutElement hitElement;
            HitModes      hitMode;

            if (!HitTest.TryHitTest(App.Profile, relativeMousePoint, out hitElement, out hitMode))
            {
                return;
            }

            // 現在選択中のIndexではない場合はそれに変更する
            if (hitElement != App.Profile.Current)
            {
                Debug.WriteLine("MouseDown: Changing Current ...",
                                "LayoutEdit");

                App.Profile.Current = hitElement;

                //---------------------------------------------------------------
                // Notify self
                // Notify other controls
                Commands.ProfileStructureChanged.Execute(null, this);
                //---------------------------------------------------------------

                this.BuildDrawingGroup();
            }

            // 右クリックの場合はCurrentを変えただけで終了(残りはコンテキストメニューに任せる)
            if (e.ChangedButton == MouseButton.Right)
            {
                return;
            }

            // マウスを押した場所を記録してマウスキャプチャー開始
            var snapGuide = App.Options.LayoutSnap ? new SnapGuide(App.Profile) : null;

            this.moveAndSize.Start(App.Profile.Current, hitMode, relativeMousePoint, snapGuide);

            // マウスキャプチャー開始
            image.CaptureMouse();

            // Profileを更新
            App.Profile.Open();

            // CompositionTarget.Renderingの実行はコストが高いのでここだけで使う
            CompositionTarget.Rendering += CompositionTarget_Rendering;
        }