protected static bool Freeze(Freezable freezable, bool isChecking) { if (freezable.frozen) { return(true); } LocalValueEnumerator e = freezable.GetLocalValueEnumerator(); while (e.MoveNext()) { var value = e.Current.Value; if (value is Freezable) { if (!(value as Freezable).FreezeCore(isChecking)) { return(false); } } } if (!isChecking) { freezable.frozen = true; } return(true); }
internal void cloneImpl(Freezable source, cloneDelegate cloneFreezable, bool freeze) { var e = source.GetLocalValueEnumerator(); while (e.MoveNext()) { var value = e.Current.Value; if (e.Current.Property.ReadOnly || value == DependencyProperty.UnsetValue || value == null) { continue; } if (value is Freezable && !(freeze && (value as Freezable).frozen)) { value = cloneFreezable(value as Freezable); } SetValue(e.Current.Property, value); } if (freeze) { Freeze(); } }
private static bool CompareFreezables(Freezable firstFreezable, Freezable secondFreezable, int depth) { if (firstFreezable == null && secondFreezable == null) { return(true); } if (firstFreezable == null || secondFreezable == null || firstFreezable.GetType() != secondFreezable.GetType()) { return(false); } IEnumerator enumerator1 = (IEnumerator)firstFreezable.GetLocalValueEnumerator(); IEnumerator enumerator2 = (IEnumerator)secondFreezable.GetLocalValueEnumerator(); while (enumerator1.MoveNext()) { if (!enumerator2.MoveNext() || !PropertyUtilities.Compare(enumerator1.Current, enumerator2.Current, depth + 1)) { return(false); } } return(!enumerator2.MoveNext()); }