private void WriteObject(object key, object obj, XmlWriter writer, bool isRoot) { List <MarkupProperty> propertyElements = new List <MarkupProperty>(); MarkupProperty contentProperty = null; string contentPropertyName = null; MarkupObject markupObj = MarkupWriter.GetMarkupObjectFor(obj); Type objectType = markupObj.ObjectType; string ns = _namespaceCache.GetNamespaceUriFor(objectType); string prefix = _namespaceCache.GetDefaultPrefixFor(ns); if (isRoot) { if (String.IsNullOrEmpty(prefix)) { if (String.IsNullOrEmpty(ns)) { writer.WriteStartElement(markupObj.ObjectType.Name, NamespaceCache.DefaultNamespace); writer.WriteAttributeString("xmlns", NamespaceCache.XmlnsNamespace, NamespaceCache.DefaultNamespace); } else { writer.WriteStartElement(markupObj.ObjectType.Name, ns); writer.WriteAttributeString("xmlns", NamespaceCache.XmlnsNamespace, ns); } } else { writer.WriteStartElement(prefix, markupObj.ObjectType.Name, ns); } writer.WriteAttributeString("xmlns", "x", NamespaceCache.XmlnsNamespace, NamespaceCache.XamlNamespace); foreach (NamespaceMap map in _dicNamespaceMap.Values) { if (!String.IsNullOrEmpty(map.Prefix) && !String.Equals(map.Prefix, "x")) { writer.WriteAttributeString("xmlns", map.Prefix, NamespaceCache.XmlnsNamespace, map.XmlNamespace); } } } else { //TODO: Fix - the best way to handle this case... if (markupObj.ObjectType.Name == "PathFigureCollection" && markupObj.Instance != null) { WriteState writeState = writer.WriteState; if (writeState == WriteState.Element) { //writer.WriteAttributeString("Figures", // markupObj.Instance.ToString()); writer.WriteAttributeString("Figures", System.Convert.ToString(markupObj.Instance, _culture)); } else { if (String.IsNullOrEmpty(prefix)) { writer.WriteStartElement("PathGeometry.Figures"); } else { writer.WriteStartElement("PathGeometry.Figures", ns); } //writer.WriteString(markupObj.Instance.ToString()); writer.WriteString(System.Convert.ToString( markupObj.Instance, _culture)); writer.WriteEndElement(); } return; } else { if (String.IsNullOrEmpty(prefix)) { writer.WriteStartElement(markupObj.ObjectType.Name); } else { writer.WriteStartElement(markupObj.ObjectType.Name, ns); } } } // Add the x:Name for object like Geometry/Drawing not derived from FrameworkElement... DependencyObject dep = obj as DependencyObject; if (dep != null) { string nameValue = SvgObject.GetName(dep); if (!String.IsNullOrEmpty(nameValue) && !(dep is FrameworkElement)) { writer.WriteAttributeString("x", "Name", NamespaceCache.XamlNamespace, nameValue); } } if (key != null) { string keyString = key.ToString(); if (keyString.Length > 0) { writer.WriteAttributeString("x", "Key", NamespaceCache.XamlNamespace, keyString); } else { //TODO: key may not be a string, what about x:Type... throw new NotImplementedException( "Sample XamlWriter cannot yet handle keys that aren't strings"); } } //Look for CPA info in our cache that keeps contentProperty names per Type //If it doesn't have an entry, go get the info and store it. if (!_contentProperties.ContainsKey(objectType)) { string lookedUpContentProperty = String.Empty; foreach (Attribute attr in markupObj.Attributes) { ContentPropertyAttribute cpa = attr as ContentPropertyAttribute; if (cpa != null) { lookedUpContentProperty = cpa.Name; //Once content property is found, come out of the loop. break; } } _contentProperties.Add(objectType, lookedUpContentProperty); } contentPropertyName = _contentProperties[objectType]; string contentString = String.Empty; foreach (MarkupProperty markupProperty in markupObj.Properties) { if (markupProperty.Name != contentPropertyName) { if (markupProperty.IsValueAsString) { contentString = markupProperty.Value as string; } else if (!markupProperty.IsComposite) { string temp = markupProperty.StringValue; if (markupProperty.IsAttached) { string ns1 = _namespaceCache.GetNamespaceUriFor(markupProperty.DependencyProperty.OwnerType); string prefix1 = _namespaceCache.GetDefaultPrefixFor(ns1); if (String.IsNullOrEmpty(prefix1)) { writer.WriteAttributeString(markupProperty.Name, temp); } else { writer.WriteAttributeString(markupProperty.Name, ns1, temp); } } else { if (markupProperty.Name == "FontUri" && (_wpfSettings != null && _wpfSettings.IncludeRuntime)) { string fontUri = temp.ToLower(); fontUri = fontUri.Replace(_windowsDir, _windowsPath); StringBuilder builder = new StringBuilder(); builder.Append("{"); builder.Append("svg"); builder.Append(":"); builder.Append("SvgFontUri "); builder.Append(fontUri); builder.Append("}"); writer.WriteAttributeString(markupProperty.Name, builder.ToString()); } else { writer.WriteAttributeString(markupProperty.Name, temp); } } } else if (markupProperty.Value.GetType() == _nullType) { if (_nullExtension) { writer.WriteAttributeString(markupProperty.Name, "{x:Null}"); } } else { propertyElements.Add(markupProperty); } } else { contentProperty = markupProperty; } } if (contentProperty != null || propertyElements.Count > 0 || contentString != String.Empty) { foreach (MarkupProperty markupProp in propertyElements) { string ns2 = _namespaceCache.GetNamespaceUriFor(markupObj.ObjectType); string prefix2 = null; if (!String.IsNullOrEmpty(ns2)) { prefix2 = _namespaceCache.GetDefaultPrefixFor(ns2); } string propElementName = markupObj.ObjectType.Name + "." + markupProp.Name; if (String.IsNullOrEmpty(prefix2)) { writer.WriteStartElement(propElementName); } else { writer.WriteStartElement(prefix2, propElementName, ns2); } WriteChildren(writer, markupProp); writer.WriteEndElement(); } if (contentString != String.Empty) { writer.WriteValue(contentString); } else if (contentProperty != null) { if (contentProperty.Value is string) { writer.WriteValue(contentProperty.StringValue); } else { WriteChildren(writer, contentProperty); } } } writer.WriteEndElement(); }
private Drawing PerformHitTest(Point pt) { if (_svgDrawing == null) { return(null); } _hitGroup = null; if (_hitList == null) { _hitList = new SortedList <int, Drawing>(); _hitPaths = new SortedList <int, WpfHitPath>(); } else if (_hitList.Count != 0) { _hitList.Clear(); _hitPaths.Clear(); } var hitRootPath = new WpfHitPath(); _hitPath = hitRootPath; Point ptDisplay = _displayTransform.Transform(pt); DrawingGroup groupDrawing = null; GlyphRunDrawing glyRunDrawing = null; GeometryDrawing geometryDrawing = null; Drawing foundDrawing = null; //var isFound = false; //var drawingLayer = this.GetDrawingLayer(_svgDrawing, ref isFound); //System.Diagnostics.Trace.WriteLine("GetId: " + SvgObject.GetId(drawingLayer)); //System.Diagnostics.Trace.WriteLine("GetName: " + SvgObject.GetName(drawingLayer)); //System.Diagnostics.Trace.WriteLine("GetUniqueId: " + SvgObject.GetUniqueId(drawingLayer)); //DrawingCollection drawings = drawingLayer.Children; DrawingCollection drawings = _svgDrawing.Children; for (int i = drawings.Count - 1; i >= 0; i--) { Drawing drawing = drawings[i]; System.Diagnostics.Trace.WriteLine("GetId: " + SvgObject.GetId(drawing)); System.Diagnostics.Trace.WriteLine("GetName: " + SvgObject.GetName(drawing)); System.Diagnostics.Trace.WriteLine("GetUniqueId: " + SvgObject.GetUniqueId(drawing)); if (TryCast.Cast(drawing, out geometryDrawing)) { if (HitTestDrawing(geometryDrawing, ptDisplay)) { // _hitPath = _hitPath.AddChild(SvgObject.GetUniqueId(geometryDrawing)); int orderNumber = SvgObject.GetOrder(drawing); if (orderNumber >= 0) { _hitList[orderNumber] = drawing; _hitPaths[orderNumber] = _hitPath.AddChild(SvgObject.GetUniqueId(geometryDrawing)); } else { string uniqueId = SvgObject.GetUniqueId(geometryDrawing); if (!string.IsNullOrWhiteSpace(uniqueId)) { foundDrawing = drawing; break; } } } } else if (TryCast.Cast(drawing, out groupDrawing)) { //var ptSaved = ptDisplay; //var transform = groupDrawing.Transform; //if (transform != null && !transform.Value.IsIdentity) //{ // ptDisplay = transform.Inverse.Transform(ptDisplay); //} _hitPath = hitRootPath.AddChild(SvgObject.GetUniqueId(groupDrawing)); int orderNumber = SvgObject.GetOrder(groupDrawing); //if (SvgObject.GetType(groupDrawing) == SvgObjectType.Text && // groupDrawing.Bounds.Contains(ptDisplay)) if (SvgObject.GetType(groupDrawing) == SvgObjectType.Text && this.HitTestText(groupDrawing, ptDisplay, out foundDrawing)) { if (orderNumber >= 0) { _hitList[orderNumber] = drawing; _hitPaths[orderNumber] = _hitPath; } else { foundDrawing = drawing; break; } } else { // _hitPath = _hitPath.AddChild(SvgObject.GetUniqueId(groupDrawing)); var currentPath = _hitPath; try { if (HitTestDrawing(groupDrawing, ptDisplay, out foundDrawing)) { if (orderNumber >= 0) { _hitList[orderNumber] = drawing; _hitPaths[orderNumber] = _hitPath.AddChild(SvgObject.GetUniqueId(foundDrawing)); } else { string uniqueId = SvgObject.GetUniqueId(foundDrawing); if (!string.IsNullOrWhiteSpace(uniqueId)) { //foundDrawing = drawing; break; } } } } finally { _hitPath = currentPath; } } } else if (TryCast.Cast(drawing, out glyRunDrawing)) { if (HitTestDrawing(glyRunDrawing, ptDisplay)) { // _hitPath = _hitPath.AddChild(SvgObject.GetUniqueId(glyRunDrawing)); int orderNumber = SvgObject.GetOrder(drawing); if (orderNumber >= 0) { _hitList[orderNumber] = drawing; _hitPaths[orderNumber] = _hitPath.AddChild(SvgObject.GetUniqueId(glyRunDrawing)); } else { foundDrawing = drawing; break; } } } } if (_hitList.Count != 0) { var key = _hitList.LastOrDefault().Key; if (_hitPaths.ContainsKey(key)) { System.Diagnostics.Trace.WriteLine("Key Found: " + _hitPaths[key].Path); } return(_hitList.LastOrDefault().Value); } if (foundDrawing == null) { return(_hitGroup); } return(foundDrawing); }