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