After installing the Windows Phone Developer Tools this is a simple test for a bit of fun using Silverlight for Mobile for the first time to capturing user strokes using the InkPresenter.
- In Visual Studio 2010 Press File –> New Project –> Silverlight for Windows Phone –> Windows Phone Application
- Add an InkPresenter and two buttons Undo and Redo to the to the content Grid
- On the InkPresenter, named inkTest in this example, Add Event handlers for MouseMove, MouseLeftButtonDown, MouseLeftButtonUp to capture the movement from the user
- To capture the mouse movements and turn them into Strokes on the InkPresenter the corresponding EventHandlers and member variables are as follows
- And since its difficult to draw with a mouse I want to be able to undo and redo some of my Strokes I use a simple Stack so implement the following EventHandlers for the Undo and Redo buttons
- And the final result is
<!--ContentGrid is empty. Place new content here--> <Grid x:Name="ContentGrid" Grid.Row="1"> <InkPresenter Name="inkTest" Background="White" Margin="0,0,0,62" /> <Button Name="btnUndo" Content="Undo" Grid.Row="1" Height="72" HorizontalAlignment="Left" Margin="44,584,0,0" VerticalAlignment="Top" Width="160" Click="btnUndo_Click" Background="#FF933A3A" /> <Button Name="btnRedo" Content="Redo" Height="72" HorizontalAlignment="Left" Margin="272,584,0,0" VerticalAlignment="Top" Width="160" Grid.Row="1" Click="btnRedo_Click" Background="#FF933A3A" /> </Grid>
inkTest.MouseMove += new MouseEventHandler(inkTest_MouseMove); inkTest.MouseLeftButtonDown += new MouseButtonEventHandler(inkTest_MouseLeftButtonDown); inkTest.MouseLeftButtonUp += new MouseButtonEventHandler(inkTest_MouseLeftButtonUp);
private Stroke _currentStroke; private void inkTest_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { _currentStroke = null; } private void inkTest_MouseMove(object sender, MouseEventArgs e) { if (_currentStroke != null) _currentStroke.StylusPoints.Add(GetStylusPoint(e.GetPosition(inkTest))); } private void inkTest_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { inkTest.CaptureMouse(); _currentStroke = new Stroke(); _currentStroke.StylusPoints.Add(GetStylusPoint(e.GetPosition(inkTest))); _currentStroke.DrawingAttributes.Color = Colors.Blue; inkTest.Strokes.Add(_currentStroke); } private StylusPoint GetStylusPoint(Point position) { return new StylusPoint(position.X, position.Y); }
private Stack _removedStrokes = new Stack(); private void btnUndo_Click(object sender, RoutedEventArgs e) { if (inkTest.Strokes != null && inkTest.Strokes.Count > 0) { _removedStrokes.Push(inkTest.Strokes.Last()); inkTest.Strokes.RemoveAt(inkTest.Strokes.Count - 1); } } private void btnRedo_Click(object sender, RoutedEventArgs e) { if (_removedStrokes != null && _removedStrokes.Count > 0) { inkTest.Strokes.Add(_removedStrokes.Pop()); } }
This demonstrated a simple application that was faster to code then to blog about and that even with an undo button I am still hopeless at drawing :). Try implementing the same functionality in the .NET Compact Framework
Next posts will look at
- Reworking this application to use MVVM
- Using the Microsoft Notification Service