GeometryDrawing序列化/反序列化

时间:2011-07-21 14:29:21

标签: c# serialization geometry drawing deserialization

需要为动态生成的样式提供某种界面(保存/编辑/加载),这些样式由GeometryDrawings组成。问题在于它们缺少Name属性的情况。我尝试过这样的事情:

// some dummy predefined style, it has more drawings but i keep first one
const string templateXaml = @"<DrawingBrush xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" Stretch=""Uniform"">
                <DrawingBrush.Drawing>
                    <DrawingGroup>
                        <DrawingGroup.Children>
                            <GeometryDrawing Geometry=""F1 M 77,92L 704,92L 704,517L 77,517L 77,92 Z "" x:Name=""test_name"">
                                <GeometryDrawing.Pen>
                                    <Pen Thickness=""4"" LineJoin=""Round"" Brush=""#FFFF7D00""/>
                                </GeometryDrawing.Pen>
                            </GeometryDrawing>
    <!--More drawings here -->
                            </DrawingGroup.Children>
                    </DrawingGroup>
                </DrawingBrush.Drawing>
            </DrawingBrush>";
        var drawingBrush = XamlReader.Parse(templateXaml) as DrawingBrush;
        var firstDrawing = (drawingBrush.Drawing as DrawingGroup).Children[0] as GeometryDrawing;
        //..
        var name = firstDrawing.GetValue(NameProperty);
        //..
        firstDrawing.SetValue(FrameworkElement.NameProperty, "some value");

我想在名称变量(或类似的东西)中输入x:名称,以便能够更改它,而不是序列化以获得相同的样式,但具有不同的图形名称(现在是大小写)被命名为Element1,2,3 ...,并且必须根据主题区域命名,并且处理必须是自动的但不是手动的,因为没有能力所见即所得 - 每个绘图都被放入Visual,Visuals被放入自定义FrameworkElement等)。当然,使用图纸的整个过程很痛苦,但这是一个我不能忽视的系统设计要求。提前谢谢。

1 个答案:

答案 0 :(得分:0)

没有找到比BL类中的包装图更好的方法并序列化/反序列化它们。丢失一致性和违反要求 - 现在我有两个表示图形对象的实体(普通几何和描述它们的类),但它们可以在需要时进行转换/互换。