コード例 #1
0
ファイル: BamlDecompiler.cs プロジェクト: keremkusmezer/ILSpy
        /// <summary>
        /// It seems like BamlReader will always output 'x:Key' as last property. However, it must be specified as attribute in valid .xaml, so we move it to the front
        /// of the attribute list.
        /// </summary>
        void MoveXKeyToFront(XamlNode node)
        {
            foreach (XamlNode child in node.Children)
            {
                MoveXKeyToFront(child);
            }

            XamlObjectNode obj = node as XamlObjectNode;

            if (obj != null && obj.Children.Count > 0)
            {
                XamlMemberNode memberNode = obj.Children[obj.Children.Count - 1] as XamlMemberNode;
                if (memberNode != null && memberNode.Member == XamlLanguage.Key)
                {
                    // move memberNode in front of the first member node:
                    for (int i = 0; i < obj.Children.Count; i++)
                    {
                        if (obj.Children[i] is XamlMemberNode)
                        {
                            obj.Children.Insert(i, memberNode);
                            obj.Children.RemoveAt(obj.Children.Count - 1);
                            break;
                        }
                    }
                }
            }
        }
コード例 #2
0
ファイル: BamlDecompiler.cs プロジェクト: keremkusmezer/ILSpy
        static List <XamlNode> Parse(XamlReader reader)
        {
            List <XamlNode>          currentList = new List <XamlNode>();
            Stack <List <XamlNode> > stack       = new Stack <List <XamlNode> >();

            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                case XamlNodeType.None:
                    break;

                case XamlNodeType.StartObject:
                    XamlObjectNode obj = new XamlObjectNode(reader.Type);
                    currentList.Add(obj);
                    stack.Push(currentList);
                    currentList = obj.Children;
                    break;

                case XamlNodeType.GetObject:
                    XamlGetObjectNode getObject = new XamlGetObjectNode();
                    currentList.Add(getObject);
                    stack.Push(currentList);
                    currentList = getObject.Children;
                    break;

                case XamlNodeType.StartMember:
                    XamlMemberNode member = new XamlMemberNode(reader.Member);
                    currentList.Add(member);
                    stack.Push(currentList);
                    currentList = member.Children;
                    break;

                case XamlNodeType.Value:
                    currentList.Add(new XamlValueNode(reader.Value));
                    break;

                case XamlNodeType.NamespaceDeclaration:
                    currentList.Add(new XamlNamespaceDeclarationNode(reader.Namespace));
                    break;

                case XamlNodeType.EndObject:
                case XamlNodeType.EndMember:
                    currentList = stack.Pop();
                    break;

                default:
                    throw new InvalidOperationException("Invalid value for XamlNodeType");
                }
            }
            if (stack.Count != 0)
            {
                throw new InvalidOperationException("Imbalanced stack");
            }
            return(currentList);
        }
コード例 #3
0
ファイル: BamlDecompiler.cs プロジェクト: keremkusmezer/ILSpy
        void RemoveConnectionIds(XamlNode node, Dictionary <int, EventRegistration[]> eventMappings, XamlSchemaContext context)
        {
            foreach (XamlNode child in node.Children)
            {
                RemoveConnectionIds(child, eventMappings, context);
            }

            XamlObjectNode obj = node as XamlObjectNode;

            if (obj != null && obj.Children.Count > 0)
            {
                var removableNodes = new List <XamlMemberNode>();
                var addableNodes   = new List <XamlMemberNode>();
                foreach (XamlMemberNode memberNode in obj.Children.OfType <XamlMemberNode>())
                {
                    if (memberNode.Member == XamlLanguage.ConnectionId && memberNode.Children.Single() is XamlValueNode)
                    {
                        var value = memberNode.Children.Single() as XamlValueNode;
                        int id;
                        if (value.Value is string && int.TryParse(value.Value as string, out id) && eventMappings.ContainsKey(id))
                        {
                            var map = eventMappings[id];
                            foreach (var entry in map)
                            {
                                if (entry.IsAttached)
                                {
                                    var type   = context.GetXamlType(Type.GetType(entry.AttachSourceType));
                                    var member = new XamlMemberNode(new XamlMember(entry.EventName, type, true));
                                    member.Children.Add(new XamlValueNode(entry.MethodName));
                                    addableNodes.Add(member);
                                }
                                else
                                {
                                    var member = new XamlMemberNode(obj.Type.GetMember(entry.EventName));
                                    member.Children.Add(new XamlValueNode(entry.MethodName));
                                    addableNodes.Add(member);
                                }
                            }
                            removableNodes.Add(memberNode);
                        }
                    }
                }
                foreach (var rnode in removableNodes)
                {
                    node.Children.Remove(rnode);
                }
                node.Children.InsertRange(node.Children.Count > 1 ? node.Children.Count - 1 : 0, addableNodes);
            }
        }
コード例 #4
0
ファイル: BamlDecompiler.cs プロジェクト: keremkusmezer/ILSpy
        void AvoidContentProperties(XamlNode node)
        {
            foreach (XamlNode child in node.Children)
            {
                AvoidContentProperties(child);
            }


            XamlObjectNode obj = node as XamlObjectNode;

            if (obj != null)
            {
                // Visit all except for the last child:
                for (int i = 0; i < obj.Children.Count - 1; i++)
                {
                    // Avoids using content property syntax for simple string values, if the content property is not the last member.
                    // Without this, we cannot decompile &lt;GridViewColumn Header="Culture" DisplayMemberBinding="{Binding Culture}" /&gt;,
                    // because the Header property is the content property, but there is no way to represent the Binding as an element.
                    XamlMemberNode memberNode = obj.Children[i] as XamlMemberNode;
                    if (memberNode != null && memberNode.Member == obj.Type.ContentProperty)
                    {
                        if (memberNode.Children.Count == 1 && memberNode.Children[0] is XamlValueNode)
                        {
                            // By creating a clone of the XamlMember, we prevent WPF from knowing that it's the content property.
                            XamlMember member = memberNode.Member;
                            memberNode.Member = new XamlMember(member.Name, member.DeclaringType, member.IsAttachable);
                        }
                    }
                }
                // We also need to avoid using content properties that have a markup extension as value, as the XamlXmlWriter would always expand those:
                for (int i = 0; i < obj.Children.Count; i++)
                {
                    XamlMemberNode memberNode = obj.Children[i] as XamlMemberNode;
                    if (memberNode != null && memberNode.Member == obj.Type.ContentProperty && memberNode.Children.Count == 1)
                    {
                        XamlObjectNode me = memberNode.Children[0] as XamlObjectNode;
                        if (me != null && me.Type.IsMarkupExtension)
                        {
                            // By creating a clone of the XamlMember, we prevent WPF from knowing that it's the content property.
                            XamlMember member = memberNode.Member;
                            memberNode.Member = new XamlMember(member.Name, member.DeclaringType, member.IsAttachable);
                        }
                    }
                }
            }
        }
コード例 #5
0
ファイル: BamlDecompiler.cs プロジェクト: keremkusmezer/ILSpy
		void RemoveConnectionIds(XamlNode node, Dictionary<int, EventRegistration[]> eventMappings, XamlSchemaContext context)
		{
			foreach (XamlNode child in node.Children)
				RemoveConnectionIds(child, eventMappings, context);
			
			XamlObjectNode obj = node as XamlObjectNode;
			if (obj != null && obj.Children.Count > 0) {
				var removableNodes = new List<XamlMemberNode>();
				var addableNodes = new List<XamlMemberNode>();
				foreach (XamlMemberNode memberNode in obj.Children.OfType<XamlMemberNode>()) {
					if (memberNode.Member == XamlLanguage.ConnectionId && memberNode.Children.Single() is XamlValueNode) {
						var value = memberNode.Children.Single() as XamlValueNode;
						int id;
						if (value.Value is string && int.TryParse(value.Value as string, out id) && eventMappings.ContainsKey(id)) {
							var map = eventMappings[id];
							foreach (var entry in map) {
								if (entry.IsAttached) {
									var type = context.GetXamlType(Type.GetType(entry.AttachSourceType));
									var member = new XamlMemberNode(new XamlMember(entry.EventName, type, true));
									member.Children.Add(new XamlValueNode(entry.MethodName));
									addableNodes.Add(member);
								} else {
									var member = new XamlMemberNode(obj.Type.GetMember(entry.EventName));
									member.Children.Add(new XamlValueNode(entry.MethodName));
									addableNodes.Add(member);
								}
							}
							removableNodes.Add(memberNode);
						}
					}
				}
				foreach (var rnode in removableNodes)
					node.Children.Remove(rnode);
				node.Children.InsertRange(node.Children.Count > 1 ? node.Children.Count - 1 : 0, addableNodes);
			}
		}
コード例 #6
0
ファイル: BamlDecompiler.cs プロジェクト: keremkusmezer/ILSpy
		static List<XamlNode> Parse(XamlReader reader)
		{
			List<XamlNode> currentList = new List<XamlNode>();
			Stack<List<XamlNode>> stack = new Stack<List<XamlNode>>();
			while (reader.Read()) {
				switch (reader.NodeType) {
					case XamlNodeType.None:
						break;
					case XamlNodeType.StartObject:
						XamlObjectNode obj = new XamlObjectNode(reader.Type);
						currentList.Add(obj);
						stack.Push(currentList);
						currentList = obj.Children;
						break;
					case XamlNodeType.GetObject:
						XamlGetObjectNode getObject = new XamlGetObjectNode();
						currentList.Add(getObject);
						stack.Push(currentList);
						currentList = getObject.Children;
						break;
					case XamlNodeType.StartMember:
						XamlMemberNode member = new XamlMemberNode(reader.Member);
						currentList.Add(member);
						stack.Push(currentList);
						currentList = member.Children;
						break;
					case XamlNodeType.Value:
						currentList.Add(new XamlValueNode(reader.Value));
						break;
					case XamlNodeType.NamespaceDeclaration:
						currentList.Add(new XamlNamespaceDeclarationNode(reader.Namespace));
						break;
					case XamlNodeType.EndObject:
					case XamlNodeType.EndMember:
						currentList = stack.Pop();
						break;
					default:
						throw new InvalidOperationException("Invalid value for XamlNodeType");
				}
			}
			if (stack.Count != 0)
				throw new InvalidOperationException("Imbalanced stack");
			return currentList;
		}