Преобразовать геометрию / путь к миниязыковой строке? - PullRequest
5 голосов
/ 08 марта 2011

Нетрудно отследить, как программно преобразовать строки пути в объекты пути в WPF, но есть ли встроенная функция для преобразования геометрии или пути обратно в строку на мини-языке?

1 Ответ

6 голосов
/ 16 апреля 2011

Редактировать: Глядя на это только сейчас, я подумал, что должен быть класс с именем GeometryConverter, который должен это делать, и это действительно так. Просто создайте один из них и используйте ConvertToString для геометрии, которую вы хотите преобразовать.


Вы можете использовать класс XamlWriter для вывода объектов в формате XAML, геометрия будет автоматически уменьшена до мини-языка.

например. если это ваш ввод:

<DrawingImage x:Name="segmentsDrawing">
    <DrawingImage.Drawing>
        <DrawingGroup>

            <GeometryDrawing Brush="Red">
                <GeometryDrawing.Pen>
                    <Pen Brush="Black" />
                </GeometryDrawing.Pen>
                <GeometryDrawing.Geometry>
                    <PathGeometry>
                        <PathFigure StartPoint="100,100">
                            <PathFigure.Segments>
                                <LineSegment Point="100,0"/>
                                <ArcSegment Point="186.6,150"  SweepDirection="Clockwise" Size="100,100"/>
                                <LineSegment Point="100,100"/>
                            </PathFigure.Segments>
                        </PathFigure>
                    </PathGeometry>
                </GeometryDrawing.Geometry>
            </GeometryDrawing>

            <GeometryDrawing Brush="Blue">
                <GeometryDrawing.Pen>
                    <Pen Brush="Black"/>
                </GeometryDrawing.Pen>
                <GeometryDrawing.Geometry>
                    <PathGeometry>
                        <PathFigure StartPoint="100,100">
                            <PathFigure.Segments>
                                <LineSegment Point="186.6,150"/>
                                <ArcSegment Point="13.4,150" SweepDirection="Clockwise" Size="100,100"/>
                                <LineSegment Point="100,100"/>
                            </PathFigure.Segments>
                        </PathFigure>
                    </PathGeometry>
                </GeometryDrawing.Geometry>
            </GeometryDrawing>

            <GeometryDrawing Brush="Green">
                <GeometryDrawing.Pen>
                    <Pen Brush="Black"/>
                </GeometryDrawing.Pen>
                <GeometryDrawing.Geometry>
                    <PathGeometry>
                        <PathFigure StartPoint="100,100">
                            <PathFigure.Segments>
                                <LineSegment Point="13.4,150"/>
                                <ArcSegment Point="100,0" SweepDirection="Clockwise" Size="100,100"/>
                                <LineSegment Point="100,100"/>
                            </PathFigure.Segments>
                        </PathFigure>
                    </PathGeometry>
                </GeometryDrawing.Geometry>
            </GeometryDrawing>
        </DrawingGroup>
    </DrawingImage.Drawing>
</DrawingImage>

... и вы его сериализуете ...

XmlTextWriter writer = new XmlTextWriter(@"C:\Users\Public\Test.xml", new UTF8Encoding());
writer.Formatting = Formatting.Indented;
writer.Indentation = 1;
writer.IndentChar = '\t';
XamlWriter.Save(segmentsDrawing, writer);

... вы получаете следующее:

<DrawingImage xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <DrawingImage.Drawing>
        <DrawingGroup>
            <DrawingGroup.Children>
                <GeometryDrawing Brush="#FFFF0000">
                    <GeometryDrawing.Pen>
                        <Pen Brush="#FF000000" />
                    </GeometryDrawing.Pen>
                    <GeometryDrawing.Geometry>
                        <PathGeometry Figures="M100,100L100,0A100,100,0,0,1,186.6,150L100,100" />
                    </GeometryDrawing.Geometry>
                </GeometryDrawing>
                <GeometryDrawing Brush="#FF0000FF">
                    <GeometryDrawing.Pen>
                        <Pen Brush="#FF000000" />
                    </GeometryDrawing.Pen>
                    <GeometryDrawing.Geometry>
                        <PathGeometry Figures="M100,100L186.6,150A100,100,0,0,1,13.4,150L100,100" />
                    </GeometryDrawing.Geometry>
                </GeometryDrawing>
                <GeometryDrawing Brush="#FF008000">
                    <GeometryDrawing.Pen>
                        <Pen Brush="#FF000000" />
                    </GeometryDrawing.Pen>
                    <GeometryDrawing.Geometry>
                        <PathGeometry Figures="M100,100L13.4,150A100,100,0,0,1,100,0L100,100" />
                    </GeometryDrawing.Geometry>
                </GeometryDrawing>
            </DrawingGroup.Children>
        </DrawingGroup>
    </DrawingImage.Drawing>
</DrawingImage>

Все PathGeometry теперь на мини-языке. Если вы хотите использовать это прямо в своем приложении, я полагаю, вы могли бы записать его в MemoryStream и получить из него данные, создав из него XmlDocument.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...