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); } } }
internal object GetValueInternal(ThemeResourceKey key) { return(key.IsEmpty ? null : GetValueInternal(key.Key)); }