diff options
author | Stephane Delcroix <stephane@delcroix.org> | 2016-04-12 18:46:39 +0200 |
---|---|---|
committer | Jason Smith <jason.smith@xamarin.com> | 2016-04-12 09:46:39 -0700 |
commit | c92297047c01112fd4a6e7695a40acb274fdf7a7 (patch) | |
tree | 413ce7f7a6d0507ff55ac237365924f55c49b345 /Xamarin.Forms.Xaml | |
parent | f975a6f2e3552c3309c8e10f15998be664d06882 (diff) | |
download | xamarin-forms-c92297047c01112fd4a6e7695a40acb274fdf7a7.tar.gz xamarin-forms-c92297047c01112fd4a6e7695a40acb274fdf7a7.tar.bz2 xamarin-forms-c92297047c01112fd4a6e7695a40acb274fdf7a7.zip |
[X] internal CreateFromXaml () (#77)
Diffstat (limited to 'Xamarin.Forms.Xaml')
-rw-r--r-- | Xamarin.Forms.Xaml/ApplyPropertiesVisitor.cs | 23 | ||||
-rw-r--r-- | Xamarin.Forms.Xaml/CreateValuesVisitor.cs | 2 | ||||
-rw-r--r-- | Xamarin.Forms.Xaml/HydratationContext.cs | 2 | ||||
-rw-r--r-- | Xamarin.Forms.Xaml/XamlLoader.cs | 58 | ||||
-rw-r--r-- | Xamarin.Forms.Xaml/XamlNode.cs | 2 |
5 files changed, 64 insertions, 23 deletions
diff --git a/Xamarin.Forms.Xaml/ApplyPropertiesVisitor.cs b/Xamarin.Forms.Xaml/ApplyPropertiesVisitor.cs index e013a742..8978f4fd 100644 --- a/Xamarin.Forms.Xaml/ApplyPropertiesVisitor.cs +++ b/Xamarin.Forms.Xaml/ApplyPropertiesVisitor.cs @@ -307,19 +307,25 @@ namespace Xamarin.Forms.Xaml if (eventInfo != null && value is string) { var methodInfo = rootElement.GetType().GetRuntimeMethods().FirstOrDefault(mi => mi.Name == (string)value); - if (methodInfo == null) - { - throw new XamlParseException(string.Format("No method {0} found on type {1}", value, rootElement.GetType()), - lineInfo); + if (methodInfo == null) { + var xpe = new XamlParseException (string.Format ("No method {0} found on type {1}", value, rootElement.GetType ()), lineInfo); + if (context.DoNotThrowOnExceptions) { + System.Diagnostics.Debug.WriteLine (xpe.Message); + return; + } else + throw xpe; } - try { eventInfo.AddEventHandler(xamlelement, methodInfo.CreateDelegate(eventInfo.EventHandlerType, rootElement)); } catch (ArgumentException) { - throw new XamlParseException(string.Format("Method {0} does not have the correct signature", value), lineInfo); + var xpe = new XamlParseException (string.Format ("Method {0} does not have the correct signature", value), lineInfo); + if (context.DoNotThrowOnExceptions) + System.Diagnostics.Debug.WriteLine (xpe.Message); + else + throw xpe; } return; @@ -416,7 +422,10 @@ namespace Xamarin.Forms.Xaml } } - throw exception; + if (context.DoNotThrowOnExceptions) + System.Diagnostics.Debug.WriteLine (exception.Message); + else + throw exception; } void SetTemplate(ElementTemplate dt, INode node) diff --git a/Xamarin.Forms.Xaml/CreateValuesVisitor.cs b/Xamarin.Forms.Xaml/CreateValuesVisitor.cs index 96af9189..d54a36d5 100644 --- a/Xamarin.Forms.Xaml/CreateValuesVisitor.cs +++ b/Xamarin.Forms.Xaml/CreateValuesVisitor.cs @@ -66,7 +66,7 @@ namespace Xamarin.Forms.Xaml return; XamlParseException xpe; - var type = XamlParser.GetElementType(node.XmlType, node, Context.RootElement.GetType().GetTypeInfo().Assembly, + var type = XamlParser.GetElementType(node.XmlType, node, Context.RootElement?.GetType().GetTypeInfo().Assembly, out xpe); if (xpe != null) throw xpe; diff --git a/Xamarin.Forms.Xaml/HydratationContext.cs b/Xamarin.Forms.Xaml/HydratationContext.cs index befb9095..7c1356d9 100644 --- a/Xamarin.Forms.Xaml/HydratationContext.cs +++ b/Xamarin.Forms.Xaml/HydratationContext.cs @@ -18,5 +18,7 @@ namespace Xamarin.Forms.Xaml public HydratationContext ParentContext { get; set; } public BindableObject RootElement { get; set; } + + public bool DoNotThrowOnExceptions { get; set; } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Xaml/XamlLoader.cs b/Xamarin.Forms.Xaml/XamlLoader.cs index 8bf08f65..575f2c7d 100644 --- a/Xamarin.Forms.Xaml/XamlLoader.cs +++ b/Xamarin.Forms.Xaml/XamlLoader.cs @@ -62,23 +62,53 @@ namespace Xamarin.Forms.Xaml continue; } - var rootnode = new RuntimeRootNode(new XmlType(reader.NamespaceURI, reader.Name, null), view); - - XamlParser.ParseXaml(rootnode, reader); + var rootnode = new RuntimeRootNode (new XmlType (reader.NamespaceURI, reader.Name, null), view, (IXmlNamespaceResolver)reader); + XamlParser.ParseXaml (rootnode, reader); + Visit (rootnode, new HydratationContext { RootElement = view }); + break; + } + } + } - var visitorContext = new HydratationContext { RootElement = view }; + public static object Create (string xaml, bool doNotThrow = false) + { + object inflatedView = null; + using (var reader = XmlReader.Create (new StringReader (xaml))) { + while (reader.Read ()) { + //Skip until element + if (reader.NodeType == XmlNodeType.Whitespace) + continue; + if (reader.NodeType != XmlNodeType.Element) { + Debug.WriteLine ("Unhandled node {0} {1} {2}", reader.NodeType, reader.Name, reader.Value); + continue; + } - rootnode.Accept(new XamlNodeVisitor((node, parent) => node.Parent = parent), null); - //set parents for {StaticResource} - rootnode.Accept(new ExpandMarkupsVisitor(visitorContext), null); - rootnode.Accept(new NamescopingVisitor(visitorContext), null); //set namescopes for {x:Reference} - rootnode.Accept(new CreateValuesVisitor(visitorContext), null); - rootnode.Accept(new RegisterXNamesVisitor(visitorContext), null); - rootnode.Accept(new FillResourceDictionariesVisitor(visitorContext), null); - rootnode.Accept(new ApplyPropertiesVisitor(visitorContext, true), null); + var rootnode = new RuntimeRootNode (new XmlType (reader.NamespaceURI, reader.Name, null), null, (IXmlNamespaceResolver)reader); + XamlParser.ParseXaml (rootnode, reader); + var visitorContext = new HydratationContext { + DoNotThrowOnExceptions = doNotThrow, + }; + var cvv = new CreateValuesVisitor (visitorContext); + cvv.Visit ((ElementNode)rootnode, null); + inflatedView = rootnode.Root = visitorContext.Values [rootnode]; + visitorContext.RootElement = inflatedView as BindableObject; + + Visit (rootnode, visitorContext); break; } } + return inflatedView; + } + + static void Visit (RootNode rootnode, HydratationContext visitorContext) + { + rootnode.Accept (new XamlNodeVisitor ((node, parent) => node.Parent = parent), null); //set parents for {StaticResource} + rootnode.Accept (new ExpandMarkupsVisitor (visitorContext), null); + rootnode.Accept (new NamescopingVisitor (visitorContext), null); //set namescopes for {x:Reference} + rootnode.Accept (new CreateValuesVisitor (visitorContext), null); + rootnode.Accept (new RegisterXNamesVisitor (visitorContext), null); + rootnode.Accept (new FillResourceDictionariesVisitor (visitorContext), null); + rootnode.Accept (new ApplyPropertiesVisitor (visitorContext, true), null); } static string GetXamlForType(Type type) @@ -197,12 +227,12 @@ namespace Xamarin.Forms.Xaml public class RuntimeRootNode : RootNode { - public RuntimeRootNode(XmlType xmlType, object root) : base(xmlType) + public RuntimeRootNode(XmlType xmlType, object root, IXmlNamespaceResolver resolver) : base (xmlType, resolver) { Root = root; } - public object Root { get; private set; } + public object Root { get; internal set; } } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Xaml/XamlNode.cs b/Xamarin.Forms.Xaml/XamlNode.cs index 2ef87c13..aa8e6c82 100644 --- a/Xamarin.Forms.Xaml/XamlNode.cs +++ b/Xamarin.Forms.Xaml/XamlNode.cs @@ -178,7 +178,7 @@ namespace Xamarin.Forms.Xaml internal abstract class RootNode : ElementNode { - protected RootNode(XmlType xmlType) : base(xmlType, xmlType.NamespaceUri, null) + protected RootNode(XmlType xmlType, IXmlNamespaceResolver nsResolver) : base(xmlType, xmlType.NamespaceUri, nsResolver) { } |