Преобразовать геометрию в путь в wpf (с помощью blend?) - PullRequest
3 голосов
/ 14 декабря 2010

мой вопрос прост.

как я могу преобразовать этот код:

<Path>
    <Path.Data>
        <EllipseGeometry Center="5,4" RadiusX="4" RadiusY="4"/>
    </Path.Data>
</Path>

во что-то вроде

<Path Data="M 0 5 L 3 10 10 0"/>

(обратите внимание, что второй производитгалочка, а не эллипс. Это было только в целях иллюстрации, и моя цель состоит только в том, чтобы найти последовательность, которая дает эллипс)

edit: я также прочитал документ о кривых Безье в xaml и полностью осведомленчто я мог бы просто создать правильный код, вычисляя точные точки кривой Безье, чтобы получить эллипс, но я не хотел бы испытывать трудности с выполнением этого вычисления самостоятельно, поэтому мне было интересно, есть ли простой способ сделать этоэто (возможно в Blend)

1 Ответ

8 голосов
/ 14 декабря 2010

Это показывает, как это сделать из кода.Я не уверен, решит ли это вашу проблему или нет - вы говорите "с смесью?"в названии, и я не знаю, как сделать это в Blend.Но я надеюсь, что это может помочь.

Первым шагом будет преобразование EllipseGeometry в PathGeometry:

var geom = new EllipseGeometry(new Point(5, 4), 4, 4);
var pathGeometry = PathGeometry.CreateFromGeometry(geom);

Как только вы получите PathGeometry, вы можетепросто позвоните ToString и получите строковое представление:

string pathText = pathGeometry.ToString();

В моей системе это дает довольно подробный текст:

"M9,4C9,6.20913899932317 7.20913899932317,8 5,8 2.79086100067683,8 1,6.20913899932317 1,4 1,1,79086100067683 2.79086100067683,0 5,0 7.20913899932317,0 9,1.79086100067683 9,4z "

Теперь, если вы хотите получить именно то, что хотели быЕсли бы вы ввели эту строку в Xaml, вам нужно сделать еще один шаг, потому что Xaml формы, которую вы предоставили:

<Path Data="M 0 5 L 3 10 10 0"/>

не дает PathGeometry.Он создает StreamGeometry, который является немного более эффективным, но фиксированным представлением пути.(Основное отличие состоит в том, что вы не можете получить отдельные объекты, представляющие различные фигуры и сегменты в StreamGeometry, тогда как вы можете в PathGeometry. StreamGeometry дешевле, в результате.)

Вы можете получить StreamGeometry из текста пути:

var streamGeometry = StreamGeometry.Parse(pathText);

И затем, если вы хотите это в Path, просто создайте его:

var p = new Path { Data = streamGeometry };

В зависимости отКакова ваша точная цель, могут быть более эффективные способы сделать это.(StreamGeometry является более эффективным представлением, поскольку в итоге создается гораздо меньше объектов. Но маршрут, по которому мой код попадает в это представление, не очень эффективен, поэтому вам лучше остановиться на PathGeometry, которыйПервый фрагмент кода, который вы можете получить. В качестве альтернативы, если ваша цель на самом деле просто получить текст пути, тогда PathGeometry также достаточно для ваших нужд.)

...