/
ResourcesLoader.cs
65 lines (56 loc) · 2.27 KB
/
ResourcesLoader.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System.IO;
using System.Reflection;
using Xamarin.Forms;
using System.Xml;
[assembly:Dependency(typeof(Xamarin.Forms.Xaml.ResourcesLoader))]
namespace Xamarin.Forms.Xaml
{
class ResourcesLoader : IResourcesLoader
{
public T CreateFromResource<T>(string resourcePath, Assembly assembly, IXmlLineInfo lineInfo) where T: new()
{
var rd = new T();
var resourceLoadingResponse = Forms.Internals.ResourceLoader.ResourceProvider2?.Invoke(new Forms.Internals.ResourceLoader.ResourceLoadingQuery {
AssemblyName = assembly.GetName(),
ResourcePath = resourcePath,
Instance = rd,
});
var alternateResource = resourceLoadingResponse?.ResourceContent;
if (alternateResource != null) {
XamlLoader.Load(rd, alternateResource, resourceLoadingResponse.UseDesignProperties);
return rd;
}
var resourceId = XamlResourceIdAttribute.GetResourceIdForPath(assembly, resourcePath);
if (resourceId == null)
throw new XamlParseException($"Resource '{resourcePath}' not found.", lineInfo);
using (var stream = assembly.GetManifestResourceStream(resourceId)) {
if (stream == null)
throw new XamlParseException($"No resource found for '{resourceId}'.", lineInfo);
using (var reader = new StreamReader(stream)) {
rd.LoadFromXaml(reader.ReadToEnd(), assembly);
return rd;
}
}
}
public string GetResource(string resourcePath, Assembly assembly, object target, IXmlLineInfo lineInfo)
{
var resourceLoadingResponse = Forms.Internals.ResourceLoader.ResourceProvider2?.Invoke(new Forms.Internals.ResourceLoader.ResourceLoadingQuery {
AssemblyName = assembly.GetName(),
ResourcePath = resourcePath,
Instance = target
});
var alternateResource = resourceLoadingResponse?.ResourceContent;
if (alternateResource != null)
return alternateResource;
var resourceId = XamlResourceIdAttribute.GetResourceIdForPath(assembly, resourcePath);
if (resourceId == null)
throw new XamlParseException($"Resource '{resourcePath}' not found.", lineInfo);
using (var stream = assembly.GetManifestResourceStream(resourceId)) {
if (stream == null)
throw new XamlParseException($"No resource found for '{resourceId}'.", lineInfo);
using (var reader = new StreamReader(stream))
return reader.ReadToEnd();
}
}
}
}