Exemplo n.º 1
0
 bool TypeMatches(XamlType t, string ns, string name, XamlType[] typeArgs)
 {
     if (t.PreferredXamlNamespace == ns && t.Name == name && t.TypeArguments.ListEquals(typeArgs))
     {
         return(true);
     }
     if (t.IsMarkupExtension)
     {
         return(t.PreferredXamlNamespace == ns && t.GetInternalXmlName() == name && t.TypeArguments.ListEquals(typeArgs));
     }
     else
     {
         return(false);
     }
 }
Exemplo n.º 2
0
        // member element, implicit member, children via content property, or value
        IEnumerable <XamlXmlNodeInfo> ReadMemberElement(XamlType parentType, XamlType xt)
        {
            XamlMember xm       = null;
            var        name     = r.LocalName;
            int        idx      = name.IndexOf('.');
            string     typeName = null;

            if (idx >= 0)
            {
                typeName = name.Substring(0, idx);
                name     = name.Substring(idx + 1);
                // check if it is an attachable member first, either of this type or another type
                // Should this also check the namespace to find the correct type?
                if (typeName == xt.GetInternalXmlName())
                {
                    xm = xt.GetMember(name);
                }
                else
                {
                    xm = FindAttachableMember(r.Prefix, typeName, name);
                }
            }
            else
            {
                xm = (XamlMember)FindStandardDirective(name, AllowedMemberLocations.MemberElement);
                if (xm == null)
                {
                    // still not? could it be omitted as content property or items ?
                    if ((xm = GetExtraMember(xt)) != null)
                    {
                        // Note that this does not involve r.Read()
                        foreach (var ni in ReadMember(xt, xm))
                        {
                            yield return(ni);
                        }
                        yield break;
                    }
                }
            }
            if (xm == null)
            {
                // Current element could be for another member in the parent type (if exists)
                if (parentType != null &&
                    typeName != null &&
                    typeName == parentType.GetInternalXmlName() &&
                    parentType.GetMember(name) != null)
                {
                    // stop the iteration and signal the caller to not read current element as an object. (It resolves conflicts between "start object for current collection's item" and "start member for the next member in the parent object".
                    yield return(Node(XamlNodeType.None, null));

                    yield break;
                }

                // ok, then create unknown member.
                xm = new XamlMember(name, xt, false);                  // FIXME: not sure if isAttachable is always false.
            }

            if (!r.IsEmptyElement)
            {
                r.Read();
                foreach (var ni in ReadMember(xt, xm))
                {
                    yield return(ni);
                }
                r.MoveToContent();
                r.ReadEndElement();
            }
            else
            {
                r.Read();
            }
        }