2011-01-07 17 views
9

Estoy buscando una manera de poder utilizar el elemento de ruta wpf para dibujar una ruta que represente una ruta en el mapa. Tengo la clase Route que contiene una colección de vértices y me gustaría usarla para el enlace. Realmente no sé cómo empezar ... ¿Algún consejo?Trazado de ruta y enlace de datos

Respuesta

21

Lo principal que necesita para que la unión es un convertidor que convierte sus puntos en Geometry la que necesitará la ruta como Data, aquí es lo que mi convertidor de un solo sentido desde un System.Windows.Point -array a la Geometría es así:

[ValueConversion(typeof(Point[]), typeof(Geometry))] 
public class PointsToPathConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Point[] points = (Point[])value; 
     if (points.Length > 0) 
     { 
      Point start = points[0]; 
      List<LineSegment> segments = new List<LineSegment>(); 
      for (int i = 1; i < points.Length; i++) 
      { 
       segments.Add(new LineSegment(points[i], true)); 
      } 
      PathFigure figure = new PathFigure(start, segments, false); //true if closed 
      PathGeometry geometry = new PathGeometry(); 
      geometry.Figures.Add(figure); 
      return geometry; 
     } 
     else 
     { 
      return null; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 

    #endregion 
} 

Ahora todo lo que queda es crear una instancia de la misma y usarla como convertidor para el enlace. Lo que podría ser similar en XAML:

<Grid> 
    <Grid.Resources> 
     <local:PointsToPathConverter x:Key="PointsToPathConverter"/> 
    </Grid.Resources> 
    <Path Data="{Binding ElementName=Window, Path=Points, Converter={StaticResource ResourceKey=PointsToPathConverter}}" 
      Stroke="Black"/> 
</Grid> 

Si necesita la unión para actualizar automáticamente usted debe trabajar con las propiedades de dependencia o interfaces como INotifyPropertyChanged/INotifyCollectionChanged

Espero que ayude: D

+0

impresionante. He escrito conversores antes, pero de alguna manera no podría haberlo descifrado. Estaba pensando en usar plantillas o estilos de datos o algo así, pero esta es una gran solución. Gracias. – kubal5003

+0

¡Me alegro de que haya sido útil! –

+0

@PortlandRunner: Es solo una propiedad de tipo 'Point []', la depuración de enlaces individuales no es el alcance de esta respuesta. –

0

también se puede tratar de esta manera:

public static class PathStrings 
{ 
    public const string Add = "F1 M 22,12L 26,12L 26,22L 36,22L 36,26L 26,26L 26,36L 22,36L 22,26L 12,26L 12,22L 22,22L 22,12 Z"; 
} 

Luego, en el recurso de crear un PathString

<Window.Resources> 
    <yourNamespace:PathStrings x:Key="pathStrings"/> 
</Window.Resources> 

continuación, se unen de esta manera:

<Path Stroke="Black" Fill="Black" 
     Data="{Binding Source={StaticResource pathStrings}, Path=Add}"></Path> 
+0

Gracias, tuve problemas con esto durante los últimos 6 años :) – kubal5003

Cuestiones relacionadas