Browse Source

Use AvaloniaDictionary for ResourceDictionary.

Steven Kirk 8 years ago
parent
commit
d1642f13f0

+ 43 - 0
src/Avalonia.Base/Collections/AvaloniaDictionary.cs

@@ -16,6 +16,7 @@ namespace Avalonia.Collections
     /// <typeparam name="TKey">The type of the dictionary key.</typeparam>
     /// <typeparam name="TValue">The type of the dictionary value.</typeparam>
     public class AvaloniaDictionary<TKey, TValue> : IDictionary<TKey, TValue>,
+        IDictionary,
         INotifyCollectionChanged,
         INotifyPropertyChanged
     {
@@ -51,6 +52,18 @@ namespace Avalonia.Collections
         /// <inheritdoc/>
         public ICollection<TValue> Values => _inner.Values;
 
+        public bool IsFixedSize => ((IDictionary)_inner).IsFixedSize;
+
+        ICollection IDictionary.Keys => ((IDictionary)_inner).Keys;
+
+        ICollection IDictionary.Values => ((IDictionary)_inner).Values;
+
+        public bool IsSynchronized => ((IDictionary)_inner).IsSynchronized;
+
+        public object SyncRoot => ((IDictionary)_inner).SyncRoot;
+
+        public object this[object key] { get => ((IDictionary)_inner)[key]; set => ((IDictionary)_inner)[key] = value; }
+
         /// <summary>
         /// Gets or sets the named resource.
         /// </summary>
@@ -174,6 +187,12 @@ namespace Avalonia.Collections
             return _inner.GetEnumerator();
         }
 
+        /// <inheritdoc/>
+        void ICollection.CopyTo(Array array, int index)
+        {
+            ((ICollection)_inner).CopyTo(array, index);
+        }
+
         /// <inheritdoc/>
         void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> item)
         {
@@ -192,6 +211,30 @@ namespace Avalonia.Collections
             return Remove(item.Key);
         }
 
+        /// <inheritdoc/>
+        void IDictionary.Add(object key, object value)
+        {
+            Add((TKey)key, (TValue)value);
+        }
+
+        /// <inheritdoc/>
+        bool IDictionary.Contains(object key)
+        {
+            return ((IDictionary)_inner).Contains(key);
+        }
+
+        /// <inheritdoc/>
+        IDictionaryEnumerator IDictionary.GetEnumerator()
+        {
+            return ((IDictionary)_inner).GetEnumerator();
+        }
+
+        /// <inheritdoc/>
+        void IDictionary.Remove(object key)
+        {
+            Remove((TKey)key);
+        }
+
         private void NotifyAdd(TKey key, TValue value)
         {
             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Count"));

+ 3 - 81
src/Avalonia.Styling/Controls/ResourceDictionary.cs

@@ -1,92 +1,14 @@
 using System;
 using System.Collections;
-using System.Collections.Generic;
+using Avalonia.Collections;
 
 namespace Avalonia.Controls
 {
     /// <summary>
     /// An indexed dictionary of resources.
     /// </summary>
-    public class ResourceDictionary : IResourceDictionary, IDictionary
+    public class ResourceDictionary : AvaloniaDictionary<string, object>, IResourceDictionary, IDictionary
     {
-        private Dictionary<string, object> _inner = new Dictionary<string, object>();
-
-        public object this[string key]
-        {
-            get { return _inner[key]; }
-            set { _inner[key] = value; }
-        }
-
-        public int Count => _inner.Count;
-
-        ICollection<string> IDictionary<string, object>.Keys => _inner.Keys;
-
-        ICollection<object> IDictionary<string, object>.Values => _inner.Values;
-
-        bool ICollection<KeyValuePair<string, object>>.IsReadOnly => false;
-
-        object IDictionary.this[object key]
-        {
-            get { return ((IDictionary)_inner)[key]; }
-            set { ((IDictionary)_inner)[key] = value; }
-        }
-
-        ICollection IDictionary.Keys => _inner.Keys;
-
-        ICollection IDictionary.Values => _inner.Values;
-
-        bool ICollection.IsSynchronized => false;
-
-        object ICollection.SyncRoot => ((IDictionary)_inner).SyncRoot;
-
-        bool IDictionary.IsFixedSize => false;
-
-        bool IDictionary.IsReadOnly => false;
-
-        public void Add(string key, object value) => _inner.Add(key, value);
-
-        public void Clear() => _inner.Clear();
-
-        public bool ContainsKey(string key) => _inner.ContainsKey(key);
-
-        public bool Remove(string key) => _inner.Remove(key);
-
-        public IEnumerator<KeyValuePair<string, object>> GetEnumerator() => _inner.GetEnumerator();
-
-        public bool TryGetValue(string key, out object value) => _inner.TryGetValue(key, out value);
-
-        public bool TryGetResource(string key, out object value) => _inner.TryGetValue(key, out value);
-
-        bool ICollection<KeyValuePair<string, object>>.Contains(KeyValuePair<string, object> item)
-        {
-            return ((IDictionary<string, object>)_inner).Contains(item);
-        }
-
-        void ICollection<KeyValuePair<string, object>>.Add(KeyValuePair<string, object> item)
-        {
-            ((IDictionary<string, object>)_inner).Add(item);
-        }
-
-        void ICollection<KeyValuePair<string, object>>.CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)
-        {
-            ((IDictionary<string, object>)_inner).CopyTo(array, arrayIndex);
-        }
-
-        bool ICollection<KeyValuePair<string, object>>.Remove(KeyValuePair<string, object> item)
-        {
-            return ((IDictionary<string, object>)_inner).Remove(item);
-        }
-
-        void ICollection.CopyTo(Array array, int index) => ((IDictionary)_inner).CopyTo(array, index);
-
-        IEnumerator IEnumerable.GetEnumerator() => _inner.GetEnumerator();
-
-        IDictionaryEnumerator IDictionary.GetEnumerator() => ((IDictionary)_inner).GetEnumerator();
-
-        void IDictionary.Add(object key, object value) => ((IDictionary)_inner).Add(key, value);
-
-        bool IDictionary.Contains(object key) => ((IDictionary)_inner).Contains(key);
-
-        void IDictionary.Remove(object key) => ((IDictionary)_inner).Remove(key);
+        public bool TryGetResource(string key, out object value) => TryGetValue(key, out value);
     }
 }