2011-01-07 15 views
9

Szukam sposobu, aby móc użyć elementu wpf Path, aby narysować ścieżkę, która będzie reprezentować trasę na mapie. Mam klasę Route zawierającą zbiór wierzchołków i chciałbym użyć jej do wiązania. Naprawdę nie wiem, jak zacząć ... Jakieś wskazówki?Tworzenie ścieżki i powiązanie danych

Odpowiedz

21

Główną rzeczą, którą trzeba za wiązanie to konwerter, który zamienia swoje punkty w Geometry którym ścieżka będzie musiał jak Data, tutaj jest to, co mój jednokierunkowy przetwornik od A System.Windows.Point -array geometrii wygląda następująco:

[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 
} 

Teraz pozostało tylko utworzyć jego egzemplarz i użyć go jako konwertera dla wiązania. Co to może wyglądać w 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> 

Jeśli potrzebujesz wiązania do automatycznej aktualizacji należy pracować z właściwości zależność lub interfejsów jak INotifyPropertyChanged/INotifyCollectionChanged

nadzieję, że pomoże: D

+0

super. Napisałem wcześniej konwertery, ale jakoś nie mogłem tego rozgryźć. Myślałem o używaniu DataTemplates lub stylów lub czegoś podobnego, ale jest to świetne rozwiązanie. Dziękuję Ci. – kubal5003

+0

Cieszę się, że pomogło! –

+0

@PortlandRunner: Jest to właściwość typu 'Point []', debugowanie pojedynczych powiązań nie jest zasięgiem tej odpowiedzi. –

0

także można spróbować to w ten sposób:

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"; 
} 

Następnie w zasobie stworzyć PathString

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

następnie powiązać ją w następujący sposób:

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

Dzięki, walczyłem z tym przez ostatnie 6 lat :) – kubal5003

Powiązane problemy