Пользовательский InkCanvas (пример кода MSDN не работает должным образом) - PullRequest
1 голос
/ 14 сентября 2009

Я хочу использовать пользовательские кисти с InkCanvas.

Это фрагмент кода из MSDN. (http://msdn.microsoft.com/en-us/library/ms747347.aspx)

Если я использую этот код и ОЧЕНЬ быстро двигаю мышь, я получаю пространство между кистями (эллипсами): Screenshot

И мой вопрос, конечно, как это исправить, но мне также любопытно, почему это происходит (я хочу извлечь из этого урок), я подумал, что, возможно, я сделал что-то не так, но даже если я вырезал / вставил пример, это происходит.

Одна маленькая вещь, которую я заметил при чтении кода, это комментарий в классе CustomStroke

// Draw linear gradient ellipses between
// all the StylusPoints in the Stroke

Мне кажется, что следует рисовать эллипсы между точками, а не только в точках.

Я использую C # .NET.

Опять вкратце:

  • Почему это происходит
  • Помогите мне исправить это :)

Ответы [ 3 ]

1 голос
/ 19 ноября 2009

Почему это происходит

Пользовательский 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 фактически предназначен для отображения данных только в точках выборки, а не между ними.

1 голос
/ 03 января 2010
0 голосов
/ 21 сентября 2009

Почему это происходит: элемент управления WPF InkCanvas имеет ограниченное количество входов в секунду при использовании мыши; Это означает, что ваши стилусные вводы будут иметь все большее и большее расстояние между ними, когда вы будете двигать мышь быстрее и быстрее. Сам образец, кажется, рисует эллипсы в каждой точке ввода стилуса, а не между точками.

Как решить эту проблему: используйте планшетный ПК - дигитайзер, такой как на планшетном ПК, имеет гораздо большее количество входов в секунду, поэтому его сложнее встретить или заполнить пробелы - по существу, оценка на основе предыдущих точек , возможно, кривая Безье.

...