Почему это происходит
Пользовательский InkCanvas в этом примере рисует эллипс на каждом собранном StrokePoint, но не пытается рисовать линии между ними. Стандартный элемент управления InkCanvas реализуется путем рисования линий между заданными точками. Вот почему пользовательская реализация InkCanvas из примера оставляет пробелы, а встроенная - нет.
Как это "исправить"
Пользовательский код можно легко расширить, чтобы не оставлять пробелов: помимо рисования эллипсов в каждой точке, он может рисовать линии между каждой парой точек.
Код для рисования соединительных линий может быть добавлен перед кодом для рисования эллипсов, например:
// Draw connecting lines
var geo = new StreamGeometry();
using(geoContext = geo.Open())
{
geoContext.StartFigure(stylusPoints[0], false, false);
geoContext.PolyLineTo(stylusPoints.Skip(1).Cast<Point>(), true, false);
}
drawingContext.DrawGeometry(null, connectingLinePen, geo);
// Draw ellipses
for(int i = 1; i < stylusPoints.Count; i++)
{
... etc ...
Этот код работает, создавая полилинию StreamGeometry и затем рисуя ее в контексте. Использование StreamGeometry в этом контексте, как правило, более эффективно, чем создание PathGeometry с помощью Polyline или выполнение нескольких вызовов DrawLine непосредственно на DrawingCanvas.
Примечание. Использование лучшего цифрового преобразователя не решит основную проблему, заключающуюся в том, что пользовательский InkCanvas фактически предназначен для отображения данных только в точках выборки, а не между ними.