/// <summary> /// Parses a Canvas element. /// </summary> Canvas ParseCanvas() { Debug.Assert(this.reader.Name == "Canvas"); Canvas canvas = new Canvas(); try { bool isEmptyElement = this.reader.IsEmptyElement; while (MoveToNextAttribute()) { switch (this.reader.Name) { case "Name": canvas.Name = this.reader.Value; break; case "RenderTransform": canvas.RenderTransform = ParseMatrixTransform(this.reader.Value); break; case "Clip": canvas.Clip = ParsePathGeometry(this.reader.Value); break; case "Opacity": canvas.Opacity = ParseDouble(this.reader.Value); break; case "OpacityMask": canvas.OpacityMask = ParseBrush(this.reader.Value); break; case "RenderOptions.EdgeMode": canvas.RenderOptions_EdgeMode = this.reader.Value; break; case "FixedPage.NavigateUri": canvas.FixedPage_NavigateUri = this.reader.Value; break; case "AutomationProperties.HelpText": canvas.AutomationProperties_HelpText = this.reader.Value; break; case "AutomationProperties.Name": canvas.AutomationProperties_Name = this.reader.Value; break; case "xml:lang": canvas.lang = this.reader.Value; break; case "xmlns:x": break; default: UnexpectedAttribute(this.reader.Name); break; } } if (!isEmptyElement) { MoveToNextElement(); while (this.reader.IsStartElement()) { switch (this.reader.Name) { case "Canvas.Resources": MoveToNextElement(); ResourceDictionary rd = new ResourceDictionary(); canvas.Resources = rd; rd.Parent = canvas; rd.ResourceParent = ResourceDictionaryStack.Current; ResourceDictionaryStack.Push(rd); ParseResourceDictionary(rd); MoveToNextElement(); break; case "Canvas.RenderTransform": MoveToNextElement(); canvas.RenderTransform = ParseMatrixTransform(); MoveToNextElement(); break; case "Canvas.Clip": MoveToNextElement(); canvas.Clip = ParsePathGeometry(); break; case "Canvas.OpacityMask": MoveToNextElement(); canvas.OpacityMask = ParseBrush(); canvas.OpacityMask.Parent = canvas; break; case "Path": { PdfSharp.Xps.XpsModel.Path path = ParsePath(); #if DEBUG if (!String.IsNullOrEmpty(path.Name)) Debug.WriteLine("Path: " + path.Name); #endif canvas.Content.Add(path); path.Parent = canvas; } break; case "Glyphs": { PdfSharp.Xps.XpsModel.Glyphs glyphs = ParseGlyphs(); canvas.Content.Add(glyphs); glyphs.Parent = canvas; } break; case "Canvas": { PdfSharp.Xps.XpsModel.Canvas canvas2 = ParseCanvas(); canvas.Content.Add(canvas2); canvas2.Parent = canvas; } break; case "mc:AlternateContent": case "mc:Choice": MoveToNextElement(); //canvas.Content.Add(ParseCanvas()); break; default: Debugger.Break(); break; } } } MoveToNextElement(); } finally { // If the current ResourceDictionary is from this Canvas, pop it. if (canvas != null && canvas.Resources != null) { if (Object.ReferenceEquals(canvas.Resources, ResourceDictionaryStack.Current)) ResourceDictionaryStack.Pop(); } } return canvas; }
/// <summary> /// Parses a ResourceDictionary element. /// </summary> void ParseResourceDictionary(ResourceDictionary dict) { //Debug.Assert(this.reader.Name == "ResourceDictionary"); Debug.Assert(this.reader.Name.Contains("Resource")); try { bool isEmptyElement = this.reader.IsEmptyElement; //ResourceDictionary dict = new ResourceDictionary(); while (MoveToNextAttribute()) { switch (this.reader.Name) { case "Source": dict.Source = this.reader.Value; break; default: UnexpectedAttribute(this.reader.Name); break; } } if (!isEmptyElement) { MoveToNextElement(); while (this.reader.IsStartElement()) { switch (this.reader.Name) { case "ImageBrush": ImageBrush ibrush = ParseImageBrush(); dict.elements[ibrush.Key] = ibrush; ibrush.Parent = dict; break; case "LinearGradientBrush": LinearGradientBrush lbrush = ParseLinearGradientBrush(); dict.elements[lbrush.Key] = lbrush; lbrush.Parent = dict; break; case "RadialGradientBrush": RadialGradientBrush rbrush = ParseRadialGradientBrush(); dict.elements[rbrush.Key] = rbrush; rbrush.Parent = dict; break; case "VisualBrush": VisualBrush vbrush = ParseVisualBrush(); dict.elements[vbrush.Key] = vbrush; vbrush.Parent = dict; break; case "SolidColorBrush": VisualBrush sbrush = ParseVisualBrush(); dict.elements[sbrush.Key] = sbrush; sbrush.Parent = dict; break; case "MatrixTransform": MatrixTransform transform = ParseMatrixTransform(); dict.elements[transform.Key] = transform; transform.Parent = dict; break; case "PathGeometry": PathGeometry geo = ParsePathGeometry(); dict.elements[geo.Key] = geo; geo.Parent = dict; break; case "Path": Path path = ParsePath(); dict.elements[path.Key] = path; path.Parent = dict; break; case "Glyphs": Glyphs glyphs = ParseGlyphs(); dict.elements[glyphs.Key] = glyphs; glyphs.Parent = dict; break; case "Canvas": Canvas canvas = ParseCanvas(); dict.elements[canvas.Key] = canvas; canvas.Parent = dict; break; default: Debugger.Break(); break; } } } MoveToNextElement(); //return dict; } finally { } }