private static void WrapMovingElementsInCanvases(List <FrameworkElement> movingElements, Dictionary <FrameworkElement, Rect> oldRects, Dictionary <FrameworkElement, Rect> newRects) { foreach (var element in movingElements) { var parent = VisualTreeHelper.GetParent(element) as FrameworkElement; var canvas = new WrapperCanvas { OldRect = oldRects[element], NewRect = newRects[element] }; var obj2 = CacheLocalValueHelper(element, FrameworkElement.DataContextProperty); element.DataContext = element.DataContext; var flag = true; if (parent is Panel panel && !panel.IsItemsHost) { var index = panel.Children.IndexOf(element); panel.Children.RemoveAt(index); panel.Children.Insert(index, canvas); }
/// <summary> /// Take all the elements that will be moving as a result of the layout animation, and wrap them in Canvases so that /// they do not affect their sibling elements. /// </summary> /// <param name="movingElements">The set of elements that will be moving</param> private static void WrapMovingElementsInCanvases(List<FrameworkElement> movingElements, Dictionary<FrameworkElement, Rect> oldRects, Dictionary<FrameworkElement, Rect> newRects) { foreach (FrameworkElement element in movingElements) { FrameworkElement parent = VisualTreeHelper.GetParent(element) as FrameworkElement; WrapperCanvas canvas = new WrapperCanvas { OldRect = oldRects[element], NewRect = newRects[element] }; foreach (DependencyProperty property in LayoutProperties) { if (!ChildAffectingLayoutProperties.Contains(property) && (CacheLocalValueHelper(element, property) != CacheActualValueHelper(element, property))) { break; } } bool flag = true; Panel panel = parent as Panel; if ((panel != null) && !panel.IsItemsHost) { int index = panel.Children.IndexOf(element); panel.Children.RemoveAt(index); panel.Children.Insert(index, canvas); } else { Border border = parent as Border; if (border != null) { border.Child = canvas; } else { flag = false; } } if (flag) { canvas.Children.Add(element); CopyLayoutProperties(element, canvas, false); } } }