Welcome to MSDN Blogs Sign in | Join | Help
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;

}

 

Posted: Monday, December 01, 2008 9:25 PM by swick

Comments

No Comments

Leave a Comment

(required) 

(required) 

(optional)

(required) 

  
Enter Code Here: Required

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Page view tracker