[Xaml] allow the Previewer to provide their own Xaml files for any type
authorStephane Delcroix <stephane@delcroix.org>
Mon, 18 Jul 2016 08:00:06 +0000 (10:00 +0200)
committerStephane Delcroix <stephane@delcroix.org>
Mon, 18 Jul 2016 08:00:06 +0000 (10:00 +0200)
Xamarin.Forms.Xaml/IXamlFileProvider.cs [new file with mode: 0644]
Xamarin.Forms.Xaml/Xamarin.Forms.Xaml.csproj
Xamarin.Forms.Xaml/XamlLoader.cs

diff --git a/Xamarin.Forms.Xaml/IXamlFileProvider.cs b/Xamarin.Forms.Xaml/IXamlFileProvider.cs
new file mode 100644 (file)
index 0000000..7f98901
--- /dev/null
@@ -0,0 +1,9 @@
+using System;
+
+namespace Xamarin.Forms.Xaml
+{
+       public interface IXamlFileProvider
+       {
+               string GetXamlFor(Type type);
+       }
+}
\ No newline at end of file
index cb4577c..0081f67 100644 (file)
@@ -81,6 +81,7 @@
     <Compile Include="ExpandMarkupsVisitor.cs" />
     <Compile Include="XamlCompilationAttribute.cs" />
     <Compile Include="TypeArgumentsParser.cs" />
+    <Compile Include="IXamlFileProvider.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
   <ItemGroup>
index 37bea4e..e0dd894 100644 (file)
@@ -38,6 +38,8 @@ namespace Xamarin.Forms.Xaml
        internal static class XamlLoader
        {
                static readonly Dictionary<Type, string> XamlResources = new Dictionary<Type, string>();
+               internal static bool DoNotThrowOnExceptions { get; set; }
+               internal static IXamlFileProvider XamlFileProvider { get; set; }
 
                public static void Load(object view, Type callingType)
                {
@@ -64,12 +66,16 @@ namespace Xamarin.Forms.Xaml
 
                                        var rootnode = new RuntimeRootNode (new XmlType (reader.NamespaceURI, reader.Name, null), view, (IXmlNamespaceResolver)reader);
                                        XamlParser.ParseXaml (rootnode, reader);
-                                       Visit (rootnode, new HydratationContext { RootElement = view });
+                                       Visit (rootnode, new HydratationContext {
+                                               RootElement = view,
+                                               DoNotThrowOnExceptions = XamlLoader.DoNotThrowOnExceptions
+                                       });
                                        break;
                                }
                        }
                }
 
+               [Obsolete ("Use the XamlFileProvider to provide xaml files")]
                public static object Create (string xaml, bool doNotThrow = false)
                {
                        object inflatedView = null;
@@ -113,6 +119,12 @@ namespace Xamarin.Forms.Xaml
 
                static string GetXamlForType(Type type)
                {
+                       string xaml = null;
+
+                       //the Previewer might want to provide it's own xaml for this... let them do that
+                       if (XamlFileProvider != null && (xaml = XamlFileProvider.GetXamlFor(type)) != null)
+                               return xaml;
+
                        var assembly = type.GetTypeInfo().Assembly;
 
                        string resourceId;
@@ -129,7 +141,6 @@ namespace Xamarin.Forms.Xaml
 
                        // first pass, pray to find it because the user named it correctly
 
-                       string xaml = null;
                        foreach (var resource in resourceNames)
                        {
                                if (ResourceMatchesFilename(assembly, resource, likelyResourceName))