public override void UpdateSvg(XmlDocument document, IEnumerable items) { try { var elements = (IEnumerable <Tuple <int, string> >)items; var offset = 25; var previousOffset = -1; var previousSpace = -1; var root = document.DocumentElement.GetElementsByTagName("g").Cast <XmlElement>().LastOrDefault(); var donutNode = root.GetElementsByTagName("circle").Cast <XmlElement>() .FirstOrDefault(x => x.HasAttribute("class") && x.Attributes["class"].Value == "donut-hole"); var donutAttr = donutNode.Attributes; donutAttr["fill"].Value = FillColor.ToHex(); var ringNode = root.GetElementsByTagName("circle").Cast <XmlElement>() .FirstOrDefault(x => x.HasAttribute("class") && x.Attributes["class"].Value == "donut-ring"); var ringAttr = ringNode.Attributes; ringAttr["stroke-width"].Value = StrokeWidth.ToString(); ringAttr["stroke"].Value = RingColor.ToHex(); var segmentNodeToCopy = root.GetElementsByTagName("circle").Cast <XmlElement>() .FirstOrDefault(x => x.HasAttribute("class") && x.Attributes["class"].Value == "donut-segment"); var centerTextNode = root.GetElementsByTagName("text").Cast <XmlElement>() .FirstOrDefault(x => x.HasAttribute("class") && x.Attributes["class"].Value == "center-text"); centerTextNode.InnerText = CharTitle; var textAttr = centerTextNode.Attributes; textAttr["fill"].Value = TitleColor.ToHex(); foreach (var el in elements) { if (el.Item1 < 0) { continue; } var newnode = segmentNodeToCopy.CloneNode(true); var attr = newnode.Attributes; attr["stroke-width"].Value = StrokeWidth.ToString(); attr["stroke"].Value = el.Item2; var spaceDash = 100 - el.Item1; attr["stroke-dasharray"].Value = $"{ el.Item1 }, { spaceDash }"; var newOffset = (previousOffset < 0) ? offset : (previousOffset + previousSpace); if (newOffset > 100) { newOffset -= 100; } attr["stroke-dashoffset"].Value = newOffset.ToString(); root.InsertAfter(newnode, root.LastChild); previousOffset = newOffset; previousSpace = spaceDash; } root.RemoveChild(segmentNodeToCopy); } catch (InvalidCastException ex) { throw new ItemsSourceException("ItemsSource for Donut chart must to be a collection of values and colors IEnumerable<Tuple<int,string>>", ex); } }