Как быстро обновить WPF canvas? - PullRequest
1 голос
/ 24 марта 2011

В моем приложении wpf я хочу обновить линию на холсте (изменить координаты начальной и конечной точек) и просмотреть изменения. Проблема в том, что я добавляю строку, но вижу только начальное и конечное состояние.

Есть ли способ сделать обновление строки / холста в реальном времени? Я хочу увидеть, как линия меняет длину / позицию.

например, я получаю список пар начала / конца для строки. если я зациклю список и обновлю координаты линии значениями из пар, я не смогу увидеть промежуточные состояния.

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

В приведенном ниже коде метод DrawLine вызывается из цикла каждый раз, когда у меня появляются новые точки.

есть предложения?

public void DrawLine(List<Library2d.Point> points)
{
    PathFigure myPathFigure = new PathFigure();
    myPathFigure.StartPoint = new System.Windows.Point(points.ElementAt(0).X, points.ElementAt(0).Y);

    LineSegment myLineSegment = new LineSegment();
    myLineSegment.Point = new System.Windows.Point(points.ElementAt(1).X, points.ElementAt(1).Y);

    PathSegmentCollection myPathSegmentCollection = new PathSegmentCollection();
    myPathSegmentCollection.Add(myLineSegment);

    myPathFigure.Segments = myPathSegmentCollection;

    PathFigureCollection myPathFigureCollection = new PathFigureCollection();
    myPathFigureCollection.Add(myPathFigure);

    PathGeometry myPathGeometry = new PathGeometry();
    myPathGeometry.Figures = myPathFigureCollection;

    if (myPath == null)
    {            
    myPath = new Path();
    myPath.Stroke = Brushes.ForestGreen;
    myPath.StrokeThickness = 1;
    canvas.Children.Add(myPath);
    }

    myPath.Data = myPathGeometry;
    myPath.Visibility = Visibility.Visible;
    myPath.InvalidateMeasure();

    canvas.Visibility = Visibility.Visible;
    canvas.InvalidateMeasure();
}

1 Ответ

2 голосов
/ 24 марта 2011

Поток рендеринга имеет более низкий приоритет диспетчера, чем поток UI, поэтому вы выполняете цикл в потоке UI, применяя все изменения сразу, а затем, наконец, средство визуализации получает снимок.

Вам следуетрассмотрите возможность привязки линии к точкам данных и обновите их.Вот статья о том, как этого добиться для полигонов: http://bea.stollnitz.com/blog/?p=35, которую вы, вероятно, могли бы адаптировать для своих нужд.

...