Ejemplo n.º 1
0
        private void InitializeExtensions() // 初始化扩展信息。
        {
            NavigationNodeList.Clear();
            PendingAppendedNodes.Clear();
            // 获取该扩展点的所有扩展信息。
            var extensions = _context.GetExtensions(NavigationExtensionPoint);

            // 将扩展XML信息转换成扩展模型。
            extensions.ForEach(extension => AddNavigationByExtension(extension));
            HandlePendingAppendedNodes();
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        /// <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);
            }
        }