summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Xaml
diff options
context:
space:
mode:
authorStephane Delcroix <stephane@delcroix.org>2016-04-12 18:46:39 +0200
committerJason Smith <jason.smith@xamarin.com>2016-04-12 09:46:39 -0700
commitc92297047c01112fd4a6e7695a40acb274fdf7a7 (patch)
tree413ce7f7a6d0507ff55ac237365924f55c49b345 /Xamarin.Forms.Xaml
parentf975a6f2e3552c3309c8e10f15998be664d06882 (diff)
downloadxamarin-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.cs23
-rw-r--r--Xamarin.Forms.Xaml/CreateValuesVisitor.cs2
-rw-r--r--Xamarin.Forms.Xaml/HydratationContext.cs2
-rw-r--r--Xamarin.Forms.Xaml/XamlLoader.cs58
-rw-r--r--Xamarin.Forms.Xaml/XamlNode.cs2
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)
{
}