/// <summary> /// Helper method used by the BringToFront and SendToBack methods. /// </summary> /// <param name="element"> /// The element to bring to the front or send to the back. /// </param> /// <param name="bringToFront"> /// Pass true if calling from BringToFront, else false. /// </param> private void UpdateZOrder(UIElement element, bool bringToFront) { #region Safety Check if (element == null) { throw new ArgumentNullException("element"); } if (!base.Children.Contains(element)) { throw new ArgumentException("Must be a child element of the Canvas.", "element"); } #endregion // Safety Check #region Calculate Z-Indexes And Offset // Determine the Z-Index for the target UIElement. int elementNewZIndex = -1; if (bringToFront) { foreach (UIElement elem in base.Children) { if (elem.Visibility != Visibility.Collapsed) { ++elementNewZIndex; } } } else { elementNewZIndex = 0; } // Determine if the other UIElements' Z-Index // should be raised or lowered by one. int offset = (elementNewZIndex == 0) ? +1 : -1; int elementCurrentZIndex = Canvas.GetZIndex(element); #endregion // Calculate Z-Indici And Offset #region Update Z-Indexes // Update the Z-Index of every UIElement in the Canvas. foreach (UIElement childElement in base.Children) { if (childElement == element) { Canvas.SetZIndex(element, elementNewZIndex); } else { int zIndex = Canvas.GetZIndex(childElement); // Only modify the z-index of an element if it is // in between the target element's old and new z-index. if (bringToFront && elementCurrentZIndex < zIndex || !bringToFront && zIndex < elementCurrentZIndex) { Canvas.SetZIndex(childElement, zIndex + offset); } } } #endregion // Update Z-Indexes }