Ejemplo n.º 1
0
        internal void Merge(string key, object value, SkinDictionaryMergeFlags mergeFlags)
        {
            var skinValue = value as SkinDictionary;

            if (skinValue == null)
            {
                object currentValue;

                if (TryGetValueCore(key, out currentValue) && AllowOverride(mergeFlags) == false)
                {
                    throw new InvalidOperationException("Duplicate key");
                }

                SetCore(key, value);
            }
            else
            {
                var themeKey = new ThemeResourceKey(key);
                var current  = EnsureKey(themeKey);

                key = themeKey.KeyParts[themeKey.KeyParts.Count - 1];

                if (current.Dictionary.TryGetValue(key, out var currentValue))
                {
                    var currentSkinValue = currentValue as SkinDictionary;

                    if (currentSkinValue == null)
                    {
                        if (AllowOverride(mergeFlags) == false)
                        {
                            throw new InvalidOperationException("Duplicate key");
                        }

                        current.SetDictionaryValue(key, value);

                        return;
                    }

                    currentSkinValue.BasedOnFlags = skinValue.BasedOnFlags;

                    foreach (var basedOn in skinValue.BasedOn)
                    {
                        if (basedOn.IsDeferred && currentSkinValue.BasedOn.Any(b => string.Equals(b.DeferredKey, basedOn.DeferredKey)) == false)
                        {
                            currentSkinValue.BasedOn.Add(basedOn);
                        }
                        else if (currentSkinValue.BasedOn.Contains(basedOn) == false)
                        {
                            currentSkinValue.BasedOn.Add(basedOn);
                        }
                    }

                    foreach (var keyValuePair in skinValue)
                    {
                        currentSkinValue.Merge(keyValuePair, mergeFlags);
                    }
                }
                else
                {
                    current.SetDictionaryValue(key, value);
                }
            }
        }
Ejemplo n.º 2
0
 internal object GetValueInternal(ThemeResourceKey key)
 {
     return(key.IsEmpty ? null : GetValueInternal(key.Key));
 }