Пользовательские InkCanvas (пример кода MSDN не работает должным образом)

StackOverflow https://stackoverflow.com/questions/1422503

  •  07-07-2019
  •  | 
  •  

Вопрос

Я хочу использовать пользовательские кисти с 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 .

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

  • Почему это происходит
  • Помогите мне это исправить :)
Это было полезно?

Решение

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

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

Примечание:Использование лучшего дигитайзера не решит основную проблему, которая заключается в том, что пользовательский InkCanvas на самом деле предназначен для отображения данных только в точках выборки, а не между ними.

Другие советы

РеДАеР Посмотри на это http://msdn.microsoft.com/en-us/library/bb531278.aspx

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

Как решить эту проблему:используйте планшетный компьютер - дигитайзер, такой как на планшетном КОМПЬЮТЕРЕ, имеет гораздо большее количество вводов в секунду, поэтому его сложнее обнаружить или заполнить пробелы - по сути, оценить на основе предыдущих точек, возможно, кривой Безье.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top