private void Grid_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e) { Point point = e.Position; Rect?boundingRect = null; bool pointIsInEffectsSheet = CharacterSheetGrid.IsPointInElement(CharacterEffectsSheet, point); bool pointIsInEffectsList = CharacterSheetGrid.IsPointInElement(PossibleEffectsList, point); if (pointIsInEffectsSheet) { Point pointInChild = CharacterSheetGrid.TranslatePointToContainer(CharacterEffectsSheet, point); originalSlotViewModel = CharacterEffectsSheet.GetEffectSlotAtPoint(pointInChild); if (originalSlotViewModel != null) { draggedViewModel = originalSlotViewModel.ActiveEffect; boundingRect = CharacterEffectsSheet.GetBoundingRectForItem(originalSlotViewModel); dragStartPosition = StartPosition.EffectGrid; } } else if (pointIsInEffectsList) { Point pointInChild = CharacterSheetGrid.TranslatePointToContainer(PossibleEffectsList, point); draggedViewModel = PossibleEffectsList.GetItemAtPoint <EffectViewModel>(pointInChild); dragStartPosition = StartPosition.PossibleList; boundingRect = PossibleEffectsList.GetBoundingRectForItem(draggedViewModel, CharacterSheetGrid); } if (draggedViewModel != null) { manipulationInitialized = true; DraggableEffect.EffectViewModel = draggedViewModel; //Save the initial touch point so we can calculate deltas lastManipulationPosition = point; DraggableEffect.Width = 300; DraggableEffect.Height = boundingRect.Value.Height - 20; //stupid magic number DraggableEffectTranslateTransform.X = boundingRect.Value.X - (CharacterSheetGrid.ActualWidth / 2) + 150; DraggableEffectTranslateTransform.Y = boundingRect.Value.Y - (CharacterSheetGrid.ActualHeight / 2) + (DraggableEffect.Height / 2); DraggableEffect.Visibility = Visibility.Visible; } }
private void Grid_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e) { if (manipulationInitialized) { DraggableEffect.Visibility = Visibility.Collapsed; switch (dragStartPosition) { case StartPosition.EffectGrid: { bool pointIsInEffectsList = CharacterSheetGrid.IsPointInElement(PossibleEffectsList, e.Position); if (pointIsInEffectsList) { CharacterViewModel.Effects.Add(draggedViewModel); originalSlotViewModel.PopEffect(); } RemoveEffectListHighlight(); break; } case StartPosition.PossibleList: { bool pointIsInEffectsSheet = CharacterSheetGrid.IsPointInElement(CharacterEffectsSheet, e.Position); if (pointIsInEffectsSheet) { Point pointInEffectSheet = CharacterSheetGrid.TranslatePointToContainer(CharacterEffectsSheet, e.Position); CharacterEffectsSheet.DropEffectInSlot(pointInEffectSheet, draggedViewModel); } CharacterEffectsSheet.ClearAllHighlights(); break; } } draggedViewModel = null; } manipulationInitialized = false; }
private void Grid_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) { if (manipulationInitialized) { Point deltaPosition = e.Position.SubtractPoint(lastManipulationPosition); DraggableEffectTranslateTransform.X += deltaPosition.X; DraggableEffectTranslateTransform.Y += deltaPosition.Y; lastManipulationPosition = e.Position; switch (dragStartPosition) { case StartPosition.EffectGrid: { bool pointIsInEffectsList = CharacterSheetGrid.IsPointInElement(PossibleEffectsList, e.Position); if (pointIsInEffectsList) { HighlightEffectsList(); } else { RemoveEffectListHighlight(); } break; } case StartPosition.PossibleList: { bool pointIsInEffectsSheet = CharacterSheetGrid.IsPointInElement(CharacterEffectsSheet, e.Position); if (pointIsInEffectsSheet) { Point pointInEffectSheet = CharacterSheetGrid.TranslatePointToContainer(CharacterEffectsSheet, e.Position); CharacterEffectsSheet.HighlightSlot(pointInEffectSheet); } break; } } } }