uwp InkCanvas将stokes保存为svg

我试图将InkCanvas,InkStorkes保存为SVG。 我找到了一个适用于Wpf的上一个问题,但是我无法让它与uwp一起工作。 Wpf InkCanvas将stokes保存为svg 。 我对它做了一些修改,但是我遇到了GetGrometry和XamlWriter的问题。

var svg = new SvgDocument(); var colorServer = new SvgColourServer(System.Drawing.Color.Black); var group = new SvgGroup { Fill = colorServer, Stroke = colorServer }; svg.Children.Add(group); foreach (var stroke in inkCanvas.InkPresenter.StrokeContainer.GetStrokes()) { var geometry = stroke.GetGeometry(stroke.DrawingAttributes).GetOutlinedPath‌​Geometry(); var s = XamlWriter.Save(geometry); if (s.IsNotNullOrEmpty()) { var element = XElement.Parse(s); var data = element.Attribute("Figures")?.Value; if (data.IsNotNullOrEmpty()) { group.Children.Add(new SvgPath { PathData = SvgPathBuilder.Parse(data), Fill = colorServer, Stroke = colorServer }); } } } 

我从Xavier Xie – MSFT的评论中实现了一种方法。

主要思想是使用自己的ICanvasPathReceiver接口实现 – 这里是CanvasGeometryToSvgPathReader类:

 var svgDocument = new CanvasSvgDocument(canvasDevice); foreach (var stroke in InkCanvas.InkPresenter.StrokeContainer.GetStrokes()) { var canvasGeometry = CanvasGeometry.CreateInk(drawingSession, new[] {stroke}); var pathReceiver = new CanvasGeometryToSvgPathReader(); canvasGeometry.SendPathTo(pathReceiver); var element = svgDocument.Root.CreateAndAppendNamedChildElement("path"); element.SetStringAttribute("d", pathReceiver.Path); element.SetColorAttribute("fill", stroke.DrawingAttributes.Color); } 

结果圆珠笔渲染精细,荧光笔更糟,铅笔不渲染。

完整源代码: https : //github.com/ycherkes/InkToSvg