diff options
Diffstat (limited to 'Xamarin.Forms.Core/ResourcesExtensions.cs')
-rw-r--r-- | Xamarin.Forms.Core/ResourcesExtensions.cs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/Xamarin.Forms.Core/ResourcesExtensions.cs b/Xamarin.Forms.Core/ResourcesExtensions.cs new file mode 100644 index 00000000..a75e264a --- /dev/null +++ b/Xamarin.Forms.Core/ResourcesExtensions.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; + +namespace Xamarin.Forms +{ + internal static class ResourcesExtensions + { + public static IEnumerable<KeyValuePair<string, object>> GetMergedResources(this IElement element) + { + Dictionary<string, object> resources = null; + while (element != null) + { + var ve = element as IResourcesProvider; + if (ve != null && ve.Resources != null && ve.Resources.Count != 0) + { + resources = resources ?? new Dictionary<string, object>(ve.Resources.Count); + foreach (KeyValuePair<string, object> res in ve.Resources) + if (!resources.ContainsKey(res.Key)) + resources.Add(res.Key, res.Value); + else if (res.Key.StartsWith(Style.StyleClassPrefix, StringComparison.Ordinal)) + { + var mergedClassStyles = new List<Style>(resources[res.Key] as List<Style>); + mergedClassStyles.AddRange(res.Value as List<Style>); + resources[res.Key] = mergedClassStyles; + } + } + var app = element as Application; + if (app != null && app.SystemResources != null) + { + resources = resources ?? new Dictionary<string, object>(8); + foreach (KeyValuePair<string, object> res in app.SystemResources) + if (!resources.ContainsKey(res.Key)) + resources.Add(res.Key, res.Value); + else if (res.Key.StartsWith(Style.StyleClassPrefix, StringComparison.Ordinal)) + { + var mergedClassStyles = new List<Style>(resources[res.Key] as List<Style>); + mergedClassStyles.AddRange(res.Value as List<Style>); + resources[res.Key] = mergedClassStyles; + } + } + element = element.Parent; + } + return resources; + } + + public static bool TryGetResource(this IElement element, string key, out object value) + { + while (element != null) + { + var ve = element as IResourcesProvider; + if (ve != null && ve.Resources != null && ve.Resources.TryGetValue(key, out value)) + return true; + var app = element as Application; + if (app != null && app.SystemResources != null && app.SystemResources.TryGetValue(key, out value)) + return true; + element = element.Parent; + } + value = null; + return false; + } + } +}
\ No newline at end of file |