Пример #1
0
        // this is a hack to initialize the propertychanged handler. The content is null on load thats why
        private void BattleCanvas_MouseMove(object sender, MouseEventArgs e)
        {
            if (this.initialize)
            {
                return;
            }

            this.initialize = true;
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(this); i++)
            {
                ContentPresenter     child = VisualTreeHelper.GetChild(this, i) as ContentPresenter;
                MageKnightBattleView mage  = FindFirstGenericChild.FindFirstChild <MageKnightBattleView>(child);
                mage.dial.MouseLeftButtonDown += Dial_MouseLeftButtonDown;
                IMageKnightBattleViewModel battleViewData = mage.DataContext as IMageKnightBattleViewModel;
                battleViewData.PropertyChanged += BattleViewData_PropertyChanged;
            }
        }
        private static void Canvas_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            if (Keyboard.IsKeyDown(Key.LeftShift))
            {
                return;
            }
            if (Mouse.LeftButton != MouseButtonState.Pressed)
            {
                return;
            }
            FrameworkElement element = sender as FrameworkElement;

            if (draggingDial == null)
            {
                return;
            }

            var mageKnightBattleView = FindFirstGenericChild.FindFirstChild <MageKnightBattleView>(draggingDial);
            IMageKnightBattleViewModel myBattleViewData = mageKnightBattleView.DataContext as IMageKnightBattleViewModel;

            if (myBattleViewData.ActionMode == ActionMode.Move || myBattleViewData.ActionMode == ActionMode.MoveFormation)
            {
                Point  mouseDownPoint  = canvasMouseDownOffset;
                Point  mouseDragPoint  = e.GetPosition(canvas);
                Vector dragDiff        = mouseDragPoint - mouseDownPoint;
                Point  centerOfMyDial  = myBattleViewData.CenterPoint;
                Point  newCenterOfDial = mouseDragPoint;


                Point  centerOfMoveBoundary = new Point(myBattleViewData.MoveStartingPoint.X, myBattleViewData.MoveStartingPoint.Y);
                Vector centerDifference     = mouseDragPoint - centerOfMoveBoundary;

                bool moveLimitReached = false;
                bool isTouchingAtLeastOneOtherMage = false;
                if (Math.Abs(centerDifference.Length) > myBattleViewData.Model.Dial.Click.Speed.Value * 100.0)
                {
                    moveLimitReached = true;
                }

                foreach (ContentPresenter mage in canvas.Children)
                {
                    var view = FindFirstGenericChild.FindFirstChild <MageKnightBattleView>(mage);
                    IMageKnightBattleViewModel data = view.DataContext as IMageKnightBattleViewModel;
                    if (data.Name.StartsWith("temp") || data.Model.InstantiatedId == myBattleViewData.Model.InstantiatedId)
                    {
                        continue;
                    }


                    Vector diff = newCenterOfDial - data.CenterPoint;

                    if (Math.Abs(diff.Length) < 100 || moveLimitReached)
                    {
                        isTouchingAtLeastOneOtherMage = true;
                        data.IsInRange = true;
                    }

                    if (Math.Abs(diff.Length) >= 100 && Math.Abs(diff.Length) < myBattleViewData.Range * 100)
                    {
                        data.IsInRange = true;
                    }
                    else
                    {
                        data.IsInRange = false;
                    }
                }



                if (!moveLimitReached && !isTouchingAtLeastOneOtherMage)
                {
                    draggingDial.SetValue(Canvas.LeftProperty, mouseDragPoint.X - myBattleViewData.Size);
                    draggingDial.SetValue(Canvas.TopProperty, mouseDragPoint.Y - myBattleViewData.Size);
                }
            }
        }