/// <summary> /// /// </summary> static void ScanSingleInstance(ResourceSourceNode resourceSourceNode, XmlElement targetNode, XmlElement resourceElement) { XmlElement gradparentNode = resourceElement.ParentNode.ParentNode as XmlElement; if (IsInvalid(gradparentNode, resourceElement, targetNode)) { return; } PropertyInfo[] properties = null; properties = GetPropertiesWherePossibleToApply(resourceElement, targetNode); if (properties != null && properties.Length > 0) { TargetNodeToApply toApply = new TargetNodeToApply(targetNode, properties); resourceSourceNode.Properties.Add(toApply); } }
/// <summary> /// /// </summary> /// <param name="xmlDoc"></param> /// <param name="listAll"></param> static void ScanForResources(XmlDocument xmlDoc, List <ResourceSourceNode> listAll) { XmlElement xmlRoot = xmlDoc.DocumentElement; NameTable table = new NameTable(); XmlNamespaceManager mngr = new XmlNamespaceManager(table); mngr.AddNamespace("x", XamlURI); XmlNodeList listResourceNodex = xmlDoc.SelectNodes("//*[@x:Key]", mngr); foreach (XmlNode resourceNode in listResourceNodex) { if (WPFXamlGenerator.ShouldThrottle(1, 2)) { continue; } XmlElement resourceElement = (XmlElement)resourceNode; string keyName = resourceElement.GetAttribute(KeyName, XamlURI); ResourceSourceNode bag = new ResourceSourceNode(resourceElement); bag.Key = keyName; SetShareableState(bag, resourceElement); // Validates that the parent on the resource XML Node // is Foo.Resources collection. if (resourceElement.ParentNode.Name.IndexOf(".Resource") != -1) { // Getting the grandparent for the assumption that of we are under Foo.Resources // and properties can be applied to the GrandParent node. // <TextBox> <=== GrandParent // <TextBox.Resources> // <SolidColorBrush Color="Red" /> <=== ResourceElement // </TextBox.Resources> // <Button /> <=== TargetNode // </TextBox> // XmlElement gradparentNode = resourceElement.ParentNode.ParentNode as XmlElement; XmlNodeList descendatNodesList = gradparentNode.SelectNodes("descendant::*"); // First scan the grandparent node to find properties. ScanSingleInstance(bag, gradparentNode, resourceElement); // Now we scan all the descendents of the grandparent node. foreach (XmlNode node in descendatNodesList) { XmlElement targetNode = node as XmlElement; ScanSingleInstance(bag, targetNode, resourceElement); } } if (bag.Properties.Count > 0) { listAll.Add(bag); } } }
static void SetShareableState(ResourceSourceNode rsNode, XmlElement resourceElement) { rsNode.XShared = GetXSharedXmlNodeValue(resourceElement); }