Exemplo n.º 1
0
        static IList <KeyValuePair <XmlName, INode> > ParseXamlAttributes(XmlReader reader, out IList <KeyValuePair <string, string> > xmlns)
        {
            Debug.Assert(reader.NodeType == XmlNodeType.Element);
            var attributes = new List <KeyValuePair <XmlName, INode> >();

            xmlns = new List <KeyValuePair <string, string> >();
            for (var i = 0; i < reader.AttributeCount; i++)
            {
                reader.MoveToAttribute(i);

                //skip xmlns
                if (reader.NamespaceURI == "http://www.w3.org/2000/xmlns/")
                {
                    xmlns.Add(new KeyValuePair <string, string>(reader.LocalName, reader.Value));
                    continue;
                }

                var namespaceUri = reader.NamespaceURI;
                if (reader.LocalName.Contains(".") && namespaceUri == "")
                {
                    namespaceUri = ((IXmlNamespaceResolver)reader).LookupNamespace("");
                }
                var propertyName = new XmlName(namespaceUri, reader.LocalName);

                object value = reader.Value;

                if (reader.NamespaceURI == "http://schemas.microsoft.com/winfx/2006/xaml")
                {
                    switch (reader.Name)
                    {
                    case "x:Key":
                        propertyName = XmlName.xKey;
                        break;

                    case "x:Name":
                        propertyName = XmlName.xName;
                        break;

                    case "x:Class":
                        continue;

                    default:
                        Debug.WriteLine("Unhandled attribute {0}", reader.Name);
                        continue;
                    }
                }

                if (reader.NamespaceURI == "http://schemas.microsoft.com/winfx/2009/xaml")
                {
                    switch (reader.Name)
                    {
                    case "x:Key":
                        propertyName = XmlName.xKey;
                        break;

                    case "x:Name":
                        propertyName = XmlName.xName;
                        break;

                    case "x:TypeArguments":
                        propertyName = XmlName.xTypeArguments;
                        value        = TypeArgumentsParser.ParseExpression((string)value, (IXmlNamespaceResolver)reader, (IXmlLineInfo)reader);
                        break;

                    case "x:DataType":
                        propertyName = XmlName.xDataType;
                        break;

                    case "x:Class":
                        continue;

                    case "x:FactoryMethod":
                        propertyName = XmlName.xFactoryMethod;
                        break;

                    case "x:Arguments":
                        propertyName = XmlName.xArguments;
                        break;

                    default:
                        Debug.WriteLine("Unhandled attribute {0}", reader.Name);
                        continue;
                    }
                }

                var propertyNode = GetValueNode(value, reader);
                attributes.Add(new KeyValuePair <XmlName, INode>(propertyName, propertyNode));
            }
            reader.MoveToElement();
            return(attributes);
        }