Well, we had another Application Bash for Expression Interactive Designer this week, and my application did something I hadn't messed with before. I wanted to work with ink in Expression, and specifically, I wanted to be able to mark up a picture, and save that markup alongside the picture to view later.

It was actually pretty easy. Drop an Image on the scene, then drop an InkCanvas on top of it. You need to set the Background to a null brush so you can see through it. By default, the InkCanvas has the EditingMode set to "Ink", which is what I want, but I changed the EditingModeInverted to EraseByPoint (just because I don't like the whole EraseByStroke model... but that's just me).

Now, I dropped a "Save" and "Load" button on the scene, and hooked them up with this code:

To save:

if (File.Exists(imagePath + ".Ink"))

{

   File.Delete(imagePath + ".Ink");

}

FileStream myStream = new FileStream(imagePath + ".Ink", FileMode.CreateNew);

inkCanvas.Strokes.Save(myStream);

myStream.Close();

Then to load:

if (File.Exists(imagePath + ".Ink"))

{

   FileStream myStream = new FileStream(imagePath + ".Ink", FileMode.Open);

   inkCanvas.Strokes = new StrokeCollection(myStream);

   myStream.Close();

}

Yes, I know there are better ways to trap the closing of the stream in a finally loop, but I was going for quick and clean. Of course, now I added controls to allow the user to browse through directories, pick a file to load, and so on. Additionally, this keeps the markup in a separate file, so it’s easy to transport the two around separately.

It’s interesting to note that the StrokeCollection can be instantiated with any stream, and the Save function on the collection can similarly use any stream, so it would be pretty easy to actually implement a shared whiteboard between two or more users.

As a side project, I want to do some investigation on how to use the handwriting APIs, and see if I can get my ink to actually get letters and words recognized J.