/// <summary> /// Update the Adorner for the given element /// </summary> /// <param name="element">UIElement for which we're updating AdornerSet</param> private void UpdateAdorner(UIElement element) { Visual adornerLayerParent = VisualTreeHelper.GetParent(this) as Visual; if (adornerLayerParent == null) { // Never update when the adorner layer is not part of a visual tree. return; } // We only expect one to have been removed on any one call. ArrayList removeList = new ArrayList(1); if (element != null) { // Make sure element is still beneath the adorner decorator if (!element.IsDescendantOf(adornerLayerParent)) { removeList.Add(element); } else { UpdateElementAdorners(element); } } else { ICollection keyCollection = ElementMap.Keys; UIElement[] keys = new UIElement[keyCollection.Count]; keyCollection.CopyTo(keys, 0); // make a static copy of the keys to prevent any possible enumerator exceptions for (int i = 0; i < keys.Length; i++) { UIElement elTemp = (UIElement)keys[i]; // Make sure element is still beneath the adorner decorator if (!elTemp.IsDescendantOf(adornerLayerParent)) { removeList.Add(elTemp); } else { UpdateElementAdorners(elTemp); } } } for (int i = 0; i < removeList.Count; i++) { Clear((UIElement)removeList[i]); } }