/// <summary> /// Callback on visiting each node in the descendency /// during an inheritable property change /// </summary> private static bool OnInheritablePropertyChanged( DependencyObject d, InheritablePropertyChangeInfo info, bool visitedViaVisualTree) { Debug.Assert(d != null, "Must have non-null current node"); DependencyProperty dp = info.Property; bool inheritanceNode = IsInheritanceNode(d, dp); if (inheritanceNode) { BaseValueSourceInternal oldValueSource = BaseValueSourceInternal.Default; INTERNAL_PropertyStorage storage; if (INTERNAL_PropertyStore.TryGetInheritedPropertyStorage(d, dp, false, out storage)) { oldValueSource = storage.BaseValueSourceInternal; } // If the oldValueSource is of lower precedence than Inheritance // only then do we need to Invalidate the property if (BaseValueSourceInternal.Inherited >= oldValueSource) { if (visitedViaVisualTree && typeof(FrameworkElement).IsInstanceOfType(d)) { DependencyObject logicalParent = ((FrameworkElement)d).Parent; if (logicalParent != null) { DependencyObject visualParent = VisualTreeHelper.GetParent(d); if (visualParent != null && visualParent != logicalParent) { return(false); } } } return(d.SetInheritedValue(dp, info.NewValue, false)); } else { if (storage == null) { // get the storage if we didn't to it ealier. INTERNAL_PropertyStore.TryGetInheritedPropertyStorage(d, dp, true, out storage); } // set the inherited value so that it is known if at some point, // the value of higher precedence that is currently used is removed. // we know that the value of the property is not changing, so we can // skip the call to UpdateEffectiveValue(...) storage.InheritedValue = info.NewValue; return(false); } } return(false); }
/// <summary> /// Sets the inherited value of a dependency property on a DependencyObject. Do not use this method. /// </summary> /// <param name="dp">The identifier of the dependency property to set.</param> /// <param name="value">The new local value.</param> /// <param name="recursively">Specifies if the inherited value must be applied to the children of this DependencyObject.</param> internal void SetInheritedValue(DependencyProperty dp, object value, bool recursively) { //----------------------- // CALL "SET INHERITED VALUE" ON THE STORAGE: //----------------------- INTERNAL_PropertyStorage storage; INTERNAL_PropertyStore.TryGetInheritedPropertyStorage(this, dp, true /*create*/, out storage); INTERNAL_PropertyStore.SetInheritedValue(storage, value, recursively); }