GeometryDrawing序列化/反序列化

本文关键字:反序列化 序列化 GeometryDrawing | 更新日期: 2023-09-27 18:02:55

需要为从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:Name在这里的名称变量(或类似的东西)能够改变它,然后序列化,例如,相同的风格,但不同的名称为图纸(情况是现在他们被命名为Element1,2,3…,并且必须根据主题区域命名,并且处理必须是自动的,而不是手动的,因为没有能力以所见即所得的方式做到这一点(每个绘图都放入可视化中,视觉效果放入自定义FrameworkElement中等)。当然,使用图纸的整个过程是痛苦的,但这是我不能忽视的系统设计需求。

GeometryDrawing序列化/反序列化

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