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中等)。当然,使用图纸的整个过程是痛苦的,但这是我不能忽视的系统设计需求。
没有找到比在BL类中包装图纸并序列化/反序列化更好的方法。失去一致性和违反需求-现在我有两个实体(平面几何和描述它们的类)表示图形对象,但它们可以在需要时转换/交换