Back-of-pen Erasing in Silverlight
As addendum to my previous post Erasing Ink in Silverlight 2 I want to show how to enable back-of-pen erasing for users with a compatible stylus device (e.g. on a Tablet PC or with an external Graphics Tablet).
The key that enables this scenario is the StylusDevice.Inverted property. It reports during mouse events whether the front-of-pen (stylus) or back-of-pen (eraser) is being used. The app can then switch into inking or erasing mode automatically, according to this value.
Here is the code-behind you need to add for an InkPresenter to enable this scenario:
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
}
private void inkPresenter_MouseLeftButtonDown(object sender,
MouseButtonEventArgs e)
{
inkPresenter.CaptureMouse();
if (e.StylusDevice.Inverted == false)
{
// ink mode
newStroke =
new Stroke(e.StylusDevice.GetStylusPoints(inkPresenter));
inkPresenter.Strokes.Add(newStroke);
}
else
{
// erase mode
erasePoints = e.StylusDevice.GetStylusPoints(inkPresenter);
}
}
private void inkPresenter_MouseMove(object sender, MouseEventArgs e)
{
if (e.StylusDevice.Inverted == false)
{
// ink mode
if (newStroke != null)
{
newStroke.StylusPoints.Add(
e.StylusDevice.GetStylusPoints(inkPresenter));
}
}
else if (e.StylusDevice.Inverted == true)
{
// erase mode
if (erasePoints != null)
{
erasePoints.Add(
e.StylusDevice.GetStylusPoints(inkPresenter));
StrokeCollection hitStrokes =
inkPresenter.Strokes.HitTest(erasePoints);
foreach (Stroke hitStroke in hitStrokes)
{
inkPresenter.Strokes.Remove(hitStroke);
}
}
}
}
private void inkPresenter_MouseLeftButtonUp(object sender,
MouseButtonEventArgs e)
{
inkPresenter.ReleaseMouseCapture();
erasePoints = null;
newStroke = null;
}
private StylusPointCollection erasePoints = null;
private Stroke newStroke = null;
}