summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Core/ResourceDictionary.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Core/ResourceDictionary.cs')
-rw-r--r--Xamarin.Forms.Core/ResourceDictionary.cs29
1 files changed, 27 insertions, 2 deletions
diff --git a/Xamarin.Forms.Core/ResourceDictionary.cs b/Xamarin.Forms.Core/ResourceDictionary.cs
index b19773ff..e5e08bc6 100644
--- a/Xamarin.Forms.Core/ResourceDictionary.cs
+++ b/Xamarin.Forms.Core/ResourceDictionary.cs
@@ -2,13 +2,38 @@ using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
+using System.Reflection;
+using System.Linq;
namespace Xamarin.Forms
{
- public sealed class ResourceDictionary : IResourceDictionary, IDictionary<string, object>
+ public class ResourceDictionary : IResourceDictionary, IDictionary<string, object>
{
readonly Dictionary<string, object> _innerDictionary = new Dictionary<string, object>();
+ Type _mergedWith;
+ [TypeConverter (typeof(TypeTypeConverter))]
+ public Type MergedWith {
+ get { return _mergedWith; }
+ set {
+ if (_mergedWith == value)
+ return;
+ _mergedWith = value;
+ if (_mergedWith == null)
+ return;
+
+ _mergedInstance = _mergedWith.GetTypeInfo().BaseType.GetTypeInfo().DeclaredMethods.First(mi => mi.Name == "GetInstance").Invoke(null, new object[] {_mergedWith}) as ResourceDictionary;
+ }
+ }
+
+ static ResourceDictionary _instance;
+ static ResourceDictionary GetInstance(Type type)
+ {
+ return _instance ?? (_instance = ((ResourceDictionary)Activator.CreateInstance (type)));
+ }
+
+ ResourceDictionary _mergedInstance;
+
void ICollection<KeyValuePair<string, object>>.Add(KeyValuePair<string, object> item)
{
((ICollection<KeyValuePair<string, object>>)_innerDictionary).Add(item);
@@ -94,7 +119,7 @@ namespace Xamarin.Forms
public bool TryGetValue(string key, out object value)
{
- return _innerDictionary.TryGetValue(key, out value);
+ return _innerDictionary.TryGetValue(key, out value) || (_mergedInstance != null && _mergedInstance.TryGetValue(key, out value));
}
event EventHandler<ResourcesChangedEventArgs> IResourceDictionary.ValuesChanged