first of all grat job and great book! Keep up the good work!
I noticed a little missing while I was studying your code:
in "SurfaceTouchDevice.cs" ContactUp event the contact is never removed from the dictionary.
void ContactUp(object sender, ContactEventArgs e)
int id = e.Contact.Id;
SurfaceTouchDevice device = deviceDictionary[id];
if (device != null &&
I think that it would be better: