Как извлечь объекты Point из StreamGeometry? - PullRequest
1 голос
/ 05 января 2012

Я построил простую StreamGeometry, используя пример MSDN:

StreamGeometry geometry = new StreamGeometry();
geometry.FillRule = FillRule.EvenOdd;
using (StreamGeometryContext ctx = geometry.Open())
{
     ctx.BeginFigure(new Point(10, 100), true /* is filled */, true /* is closed */);
     ctx.LineTo(new Point(100, 100), true /* is stroked */, false /* is smooth join */);
     ctx.LineTo(new Point(100, 50), true /* is stroked */, false /* is smooth join */);
 }
 return geometry;

Как я могу получить объекты Point из StreamGeometry?
Кажется, я не могу найти подходящий метод.Все, что я вижу, это ToString () , который дает мне мини-языковой формат: {M10,100L100,100 100,50z}

Ответы [ 3 ]

2 голосов
/ 05 января 2012

Вы не можете изменить StreamGeometry после его создания.Я уверен, что вы не можете получить доступ к точкам, которые вы добавили.Можете ли вы использовать PathGeometry вместо этого?Вы можете получить доступ и изменить точки после построения с помощью свойства PathGeometry.Figures .

1 голос
/ 05 января 2012

Я сделал что-то похожее для silverlight ...

по следующей ссылке вы можете найти код (работает и для WPF), чтобы получить очки из пути геоматерии

Создание геометрии путииз строки данных.динамическое создание пути http://bathinenivenkatesh.blogspot.com/2009/05/creating-path-geometry-from-data-string.html

Получение фигур геометрии пути из объекта PathGeometary http://bathinenivenkatesh.blogspot.com/2009/05/silverlight-get-path-geomatery-figures.html

1 голос
/ 05 января 2012

вот что мы сделали для аналогичной задачи. Обратите внимание, что ваша геометрия не должна содержать ничего, кроме линий. По сути, это крошечный уровень абстракции поверх Geometry, Stroke () возвращает кортеж с языком схожести и набором очков. Вы можете сделать Навигатор привязываемым, написав простое поведение, пожалуйста, дайте мне знать, если интересно, и я подправлю свой ответ для него.

Обновление 1 - функция, которая принимает мини-выражение и возвращает массив Point:

public static Point[] Parse(string minilanguage)
        {
            // leave just M's
            minilanguage = minilanguage.ToUpper().Replace("M", string.Empty);

            // remove spaces
            minilanguage = minilanguage
                .ToCharArray()
                .Where(t => t != ' ')
                .Select(t => t.ToString())
                .Aggregate((f, s) => f + s).ToString();


            return minilanguage
                .Split("L".ToCharArray())
                .Select(t => Point.Parse(t))
                .ToArray();
        }

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace GeometryParts
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
        }

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            Navigator navigator = new Navigator(0, 0);

            navigator.NavigateTo(30, 30);
            navigator.NavigateTo(60, 0);

            Tuple<string, Point[]> stroke = navigator.Stroke();
            this.g.Data = Geometry.Parse(stroke.Item1);

            MessageBox.Show(stroke.Item2.Length.ToString());
        }
    }


    public class Navigator
    {
        private List<Point> points = new List<Point>();

        public Navigator(double x, double y)
        {
            this.points.Add(new Point(x, y));
        }

        public void NavigateTo(double x, double y)
        {
            this.points.Add(new Point(x, y));
        }

        public Tuple<string, Point[]> Stroke()
        {
            string path = this.points.Select(t => t.ToString()).Aggregate((f, s) => "L" + f + " L" + s);
            path = "M" + path.Substring(2, path.Length - 2);

            Tuple<string, Point[]> stroke = new Tuple<string, Point[]>(path, this.points.ToArray());
            points.Clear();

            return stroke;
        }
    }
}

Markup:

<Window x:Class="GeometryParts.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Path Stroke="Gray" StrokeThickness="2" x:Name="g" />
    </Grid>
</Window>
...