internal static void InvalidateAutomationAncestors(DependencyObject o) { UIElement e = null; UIElement3D e3d = null; ContentElement ce = null; Stack <DependencyObject> branchNodeStack = new Stack <DependencyObject>(); bool continueInvalidation = true; while (o != null && continueInvalidation) { continueInvalidation &= InvalidateAutomationPeer(o, out e, out ce, out e3d); // // Invoke InvalidateAutomationAncestorsCore // bool continuePastVisualTree = false; if (e != null) { continueInvalidation &= e.InvalidateAutomationAncestorsCore(branchNodeStack, out continuePastVisualTree); // Get element's visual parent o = e.GetUIParent(continuePastVisualTree); } else if (ce != null) { continueInvalidation &= ce.InvalidateAutomationAncestorsCore(branchNodeStack, out continuePastVisualTree); // Get element's visual parent o = (DependencyObject)ce.GetUIParent(continuePastVisualTree); } else if (e3d != null) { continueInvalidation &= e3d.InvalidateAutomationAncestorsCore(branchNodeStack, out continuePastVisualTree); // Get element's visual parent o = e3d.GetUIParent(continuePastVisualTree); } } }