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