开发者

Convert Geometry/Path to Minilanguage String?

It's not too hard to track down how to programmatically convert path strings into path objects in WPF, but is there a built-in function开发者_运维问答 to convert a geometry or path back to a string in the mini-language?


Edit: Looking at this just now i thought that there should be a class called GeometryConverter which should be able to do this, and indeed there is. Just create one of those and use ConvertToString on the geometry you want to convert.


You can use the XamlWriter class to output objects as XAML, geometry will automatically be reduced to the mini-language.

e.g. if this is your input:

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

...and you serialize it...

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);

...you get the following:

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

All the PathGeometry is now in mini-language. If you want to use this right away in your application i suppose you could write it to a MemoryStream and get the data from it by creating a XmlDocument from it.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜