2011-03-24 2 views
1

Dans mon application wpf, je veux mettre à jour une ligne sur le canevas (changer les coordonnées de début, de point final) et prévisualiser le changement. Le problème est que j'ajoute la ligne mais je ne peux voir que l'état initial et final.Comment mettre à jour la toile WPF très rapidement?

Existe-t-il un moyen de mettre à jour la ligne/canevas lui-même en temps réel? Je veux voir comment la ligne change de longueur/position.

Par exemple, je reçois une liste de paires début/fin pour la ligne. Si je boucle la liste et mettre à jour les coordonnées de la ligne avec les valeurs des paires je ne peux pas voir les états intermédiaires.

J'ai essayé de définir la visibilité de la ligne et du canevas pour les rendre visibles, mais cela ne fonctionne pas. Si je viens d'ajouter de nouvelles lignes, je ne peux pas voir comment ils sont ajoutés, juste la dernière étape.

Dans le code ci-dessous, la méthode DrawLine est appelée à partir d'une boucle chaque fois que j'ai de nouveaux points.

des suggestions?

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(); 
} 

Répondre

2

Le fil de rendu a une priorité répartiteur inférieur au thread d'interface utilisateur de sorte que vous exécutez à travers la boucle dans le thread d'interface utilisateur en appliquant toutes les modifications à la fois, puis finalement le moteur de rendu reçoit un coup de feu à elle.

Vous devez envisager de lier la ligne aux points de données et de les mettre à jour à la place. Voici un article sur comment y parvenir pour les polygones: http://bea.stollnitz.com/blog/?p=35 que vous pourriez probablement adapter à vos besoins.

Questions connexes