Trying using the hold event on the grid to define that an object is to be moved. (You could manipulate the background colour to show the grid can now be moved).
Then use the manipulation events for the grid to move the control around (Manipulation Delta and ManipulationCompleted). Manipulation delta will give you translation in both the X and Y domain. Use the Y translation to move the object up or down by the specified translation. ManipulationCompleted can then be used to define that the grid has finished being moved.
I.e
private void holdEvent(object sender, System.Windows.Input.GestureEventArgs e)
{
// Change the background of the exercise label
Grid grid = (Grid)sender;
grid.setBackground(Colors.Gray);
// Apply manipulation events
grid.ManipulationDelta += new EventHandler<System.Windows.Input.ManipulationDeltaEventArgs>(GridMoving);
grid.ManipulationCompleted += new EventHandler<ManipulationCompletedEventArgs>(GridMoved);
}
private void GridMoving(object sender, ManipulationDeltaEventArgs e)
{
// Manipulate the position of the grid here
}
private void ExerciseMoved(object sender, ManipulationCompletedEventArgs e)
{
//Change background colour back
Grid grid = (Grid)sender;
grid.setBackground(Colors.White); // Use the original colour here
// Remove the manipulation events from that specified grid, so it wont move,
// when the user trys to move a different grid.
grid.ManipulationDelta -= ExerciseMoving;
grid.ManipulationCompleted -= ExerciseMoved;
}