Обновление: наконец-то я нашел способ исправить это, чтобы оно работало в Windows Phone 7, а не только в WPF.
На основе приведенного вами примера.
Определение списка точек:
private List<Point> _points;
Когда кнопка LeftMouseButton выключена AND Up добавить пустую точку и начальную точку:
oldPoint = currentPoint;
_points.Add(new Point(-1, -1));
_points.Add(oldPoint);
Ваш обработчик событий кнопки Play будет выглядеть следующим образом:
canvas.Children.Clear();
// Use the BackgroundWorker to draw the lines
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerAsync();
worker_DoWork перебирает точки _ и отправляет их нашему диспетчеру:
void worker_DoWork(object sender, DoWorkEventArgs e)
{
for (int ix = 0; ix < _points.Count - 1; ix++)
{
Point start = _points[ix];
Point end = _points[ix + 1];
if (start.X == -1 || end.X == -1)
continue;
Thread.Sleep(10);
DoEvents(start, end);
}
}
DoEvents использует Dispatcher
дляотправить координаты линии делегированному методу
private delegate void AddLineDelegate(Point p1, Point p2);
private void DoEvents(Point p1, Point p2)
{
this.Dispatcher.BeginInvoke(new AddLineDelegate(AddLine), new object[] { p1, p2 });
}
private void AddLine(Point p1, Point p2)
{
Line line = new Line() { X1 = p1.X, Y1 = p1.Y, X2 = p2.X, Y2 = p2.Y };
line.Stroke = new SolidColorBrush(Colors.Black);
line.StrokeThickness = 4;
this.canvas.Children.Add(line);
}