blob: e5a7aef7f72cc2e427a5de82c1d2114498ccfffd (
plain)
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
|
using System;
namespace Xamarin.Forms.Xaml
{
[ContentProperty("Key")]
public sealed class StaticResourceExtension : IMarkupExtension
{
public string Key { get; set; }
public object ProvideValue(IServiceProvider serviceProvider)
{
if (serviceProvider == null)
throw new ArgumentNullException("serviceProvider");
if (Key == null)
{
var lineInfoProvider = serviceProvider.GetService(typeof (IXmlLineInfoProvider)) as IXmlLineInfoProvider;
var lineInfo = (lineInfoProvider != null) ? lineInfoProvider.XmlLineInfo : new XmlLineInfo();
throw new XamlParseException("you must specify a key in {StaticResource}", lineInfo);
}
var valueProvider = serviceProvider.GetService(typeof (IProvideValueTarget)) as IProvideParentValues;
if (valueProvider == null)
throw new ArgumentException();
var xmlLineInfoProvider = serviceProvider.GetService(typeof (IXmlLineInfoProvider)) as IXmlLineInfoProvider;
var xmlLineInfo = xmlLineInfoProvider != null ? xmlLineInfoProvider.XmlLineInfo : null;
foreach (var p in valueProvider.ParentObjects)
{
var ve = p as VisualElement;
if (ve == null)
continue;
if (ve.Resources == null)
continue;
object res;
if (ve.Resources.TryGetValue(Key, out res))
return res;
}
if (Application.Current != null && Application.Current.Resources != null &&
Application.Current.Resources.ContainsKey(Key))
return Application.Current.Resources[Key];
throw new XamlParseException(string.Format("StaticResource not found for key {0}", Key), xmlLineInfo);
}
}
}
|