Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
930 views
in Technique[技术] by (71.8m points)

wpf - How to draw a collection of points as separate circles?

My view model has a PointCollection property like this:

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private PointCollection points;
    public PointCollection Points
    {
        get { return points; }
        set
        {
            points = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Points)));
        }
    }
}

This is usually shown as a polyline:

<Polyline Points="{Binding Points}" Stroke="Black" StrokeThickness="2"/>

How would I efficiently show it as a collection of separate circles?

It may well be done by an ItemsControl with e.g. a Path element with an EllipseGeometry in its ItemTemplate, however that would involve a large number of UI elements, which may not perform well for a large number of Points in the PointsCollection.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

A Binding Converter like shown below could convert an IEnumerable<Point> into a StreamGeometry that consists of a set of zero-length lines.

These could be drawn as circles by a Path with StrokeStartLineCap and StrokeEndLineCap set to Round.

public class LinePointsConverter : IValueConverter
{
    public object Convert(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        var geometry = new StreamGeometry();
        var points = value as IEnumerable<Point>;

        if (points != null && points.Any())
        {
            using (var sgc = geometry.Open())
            {
                foreach (var point in points)
                {
                    sgc.BeginFigure(point, false, false);
                    sgc.LineTo(point, true, false);
                }
            }
        }

        return geometry;
    }

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

The Path would look like this:

<Path Data="{Binding Points, Converter={StaticResource LinePointsConverter}}"
      Stroke="Black" StrokeThickness="5"
      StrokeStartLineCap="Round" StrokeEndLineCap="Round"/>

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...