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/XamlLoader.cs | |
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/XamlLoader.cs')
-rw-r--r-- | Xamarin.Forms.Xaml/XamlLoader.cs | 58 |
1 files changed, 44 insertions, 14 deletions
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 |