public void Visit(ISvgUseElement element) { SvgUseElement useElement = (SvgUseElement)element; SvgDocument document = useElement.OwnerDocument; XmlElement refEl = useElement.ReferencedElement; if (refEl == null) { return; } XmlElement refElParent = (XmlElement)refEl.ParentNode; bool isImported = false; // For the external node, the documents are different, and we may not be // able to insert this node, so we first import it... if (useElement.OwnerDocument != refEl.OwnerDocument) { var importedNode = useElement.OwnerDocument.ImportNode(refEl, true) as XmlElement; if (importedNode != null) { var importedSvgElement = importedNode as SvgElement; if (importedSvgElement != null) { importedSvgElement.Imported = true; importedSvgElement.ImportNode = refEl as SvgElement; importedSvgElement.ImportDocument = refEl.OwnerDocument as SvgDocument; } refEl = importedNode; isImported = true; } } useElement.OwnerDocument.Static = true; useElement.CopyToReferencedElement(refEl); if (!isImported) // if imported, we do not need to remove it... { refElParent.RemoveChild(refEl); } useElement.AppendChild(refEl); // Now, render the use element... var refElement = useElement?.FirstChild; ISvgElementVisitorTarget evt = refElement as ISvgElementVisitorTarget; if (evt != null) { evt.Accept(this); } useElement.RemoveChild(refEl); useElement.RestoreReferencedElement(refEl); if (!isImported) { refElParent.AppendChild(refEl); } useElement.OwnerDocument.Static = false; }
public void Render(ISvgElement node) { ISvgElementVisitorTarget evt = node as ISvgElementVisitorTarget; if (evt != null) { RenderElement(evt); } }
private void RenderElement(ISvgElementVisitorTarget element) { if (this.Canvas == null) { this.Canvas = new Canvas(); } ShapeRenderingVisitor visitor = new ShapeRenderingVisitor(this); visitor.BeginContainer(); element.Accept(visitor); visitor.EndContainer(); }
public void Accept(ISvgElementVisitor visitor) { visitor.Visit(this); if (this.HasChildNodes) { visitor.BeginContainer(this); foreach (var item in this.ChildNodes) { ISvgElementVisitorTarget evt = item as ISvgElementVisitorTarget; if (evt != null) { evt.Accept(visitor); } } visitor.EndContainer(this); } }