private void InitializeExtensions() // 初始化扩展信息。 { NavigationNodeList.Clear(); PendingAppendedNodes.Clear(); // 获取该扩展点的所有扩展信息。 var extensions = _context.GetExtensions(NavigationExtensionPoint); // 将扩展XML信息转换成扩展模型。 extensions.ForEach(extension => AddNavigationByExtension(extension)); HandlePendingAppendedNodes(); }
private void HandlePendingAppendedNodes() { if (PendingAppendedNodes.Count == 0) { return; } var nodesStack = new List <NavigationNode>(); NavigationNodeList.ForEach(navNode => nodesStack.Add(navNode)); PendingAppendedNodes.ToList().ForEach(navNode => nodesStack.Add(navNode)); List <NavigationNode> currentStack; NavigationNode current; foreach (var node in PendingAppendedNodes.ToArray()) { currentStack = new List <NavigationNode>(nodesStack.ToArray()); while (currentStack.Count > 0) { current = currentStack[0]; currentStack.RemoveAt(0); if (node.ParentId.Equals(current.Id)) { current.Children.Add(node); node.Parent = current; PendingAppendedNodes.Remove(node); NavigationNodeList.Remove(node); continue; } foreach (var child in current.Children) { currentStack.Add(child); } } } foreach (var node in PendingAppendedNodes) { using (var locker = NavigationNodeList.Lock()) { if (locker.Contains(node)) { continue; } } NavigationNodeList.Add(node); } }
/// <summary> /// 将Xml节点转换成导航节点对象。 /// </summary> /// <param name="nav">所属Navigation。</param> /// <param name="node">Xml节点。</param> /// <param name="Parent">父导航节点。</param> /// <param name="children">子导航节点列表。</param> private void ConvertToNode(NavigationNode parent, XmlNode node, IBundle bundle) { // 获取Id、Name、Value、Order、Permisson、Icon和Tooltip属性。 string id = GetAttribute(node, "Id"); string name = GetAttribute(node, "Name"); if (string.IsNullOrEmpty(name)) { FileLogUtility.Warn("The Name attribute can not be empty for UIShell.NavigationService extension."); return; } string value = GetAttribute(node, "Value"); string order = GetAttribute(node, "Order"); float orderFloat = 0; float.TryParse(order, out orderFloat); string permission = GetAttribute(node, "Permission"); string icon = GetAttribute(node, "Icon"); string toolTip = GetAttribute(node, "Tooltip"); string parentId = GetAttribute(node, "ParentId"); // 创建导航节点。 var navNode = new NavigationNode { ParentId = string.IsNullOrEmpty(parentId) ? Guid.NewGuid().ToString() : parentId, Id = string.IsNullOrEmpty(id) ? Guid.NewGuid().ToString() : id, Name = name, Order = orderFloat, Value = value, Permission = permission, Icon = icon, ToolTip = toolTip, Bundle = bundle }; // 设置父节点,并添加到子节点列表。 if (!string.IsNullOrEmpty(parentId)) { PendingAppendedNodes.Add(navNode); } else if (string.IsNullOrEmpty(parentId)) { if (parent != null) { navNode.Parent = parent; parent.Children.Add(navNode); } else { navNode.Parent = null; navNode.ParentId = Guid.NewGuid().ToString(); NavigationNodeList.Add(navNode); } } // 将XML节点其它的属性保存到Attributes字典。 foreach (XmlAttribute attr in node.Attributes) { if (attr.Name.Equals("Id") || attr.Name.Equals("Name") || attr.Name.Equals("Value") || attr.Name.Equals("Order") || attr.Name.Equals("Permission") || attr.Name.Equals("Icon") || attr.Name.Equals("ToolTip")) { continue; } navNode.Attributes[attr.Name] = attr.Value; } // 遍历Xml子节点,并递归转换成导航节点。 foreach (XmlNode childnode in node.ChildNodes) { if (childnode is XmlComment) { continue; } ConvertToNode(navNode, childnode, bundle); } }