private static void AnimateToPosition(DependencyObject d, Rect desiredPosition) { Rect position = ArrangePanel.GetPosition(d); if (double.IsNaN(position.X)) { ArrangePanel.SetPosition(d, desiredPosition); } else { Vector vector = desiredPosition.TopLeft - position.TopLeft; double length1 = vector.Length; vector = desiredPosition.BottomRight - position.BottomRight; double length2 = vector.Length; TimeSpan timeSpan = TimeSpan.FromMilliseconds(Math.Max(length1, length2) * 1.0); RectAnimation rectAnimation1 = new RectAnimation(position, desiredPosition, new Duration(timeSpan)); rectAnimation1.DecelerationRatio = 1.0; RectAnimation rectAnimation2 = rectAnimation1; if (!(d is UIElement uiElement)) { return; } uiElement.BeginAnimation(ArrangePanel.PositionProperty, (AnimationTimeline)rectAnimation2); } }
private static void OnDesiredPositionChanged( DependencyObject d, DependencyPropertyChangedEventArgs e) { Rect newValue = (Rect)e.NewValue; ArrangePanel.AnimateToPosition(d, newValue); }
private void DoReordering(MouseEventArgs e) { e.Handled = true; Point position = e.GetPosition((IInputElement)this); ArrangePanel.SetOrder((DependencyObject)this._draggingObject, this._strategy.GetIndex(position)); ArrangePanel.SetPosition((DependencyObject)this._draggingObject, new Rect(position + this._delta, ArrangePanel.GetPosition((DependencyObject)this._draggingObject).Size)); }
private void InitializeEmptyOrder() { int num = this.Children.OfType <UIElement>().Max <UIElement>((Func <UIElement, int>)(ch => ArrangePanel.GetOrder((DependencyObject)ch))) + 1; foreach (DependencyObject dependencyObject in this.Children.OfType <UIElement>().Where <UIElement>((Func <UIElement, bool>)(child => ArrangePanel.GetOrder((DependencyObject)child) == -1))) { ArrangePanel.SetOrder(dependencyObject, num); ++num; } }
protected override Size ArrangeOverride(Size finalSize) { foreach (UIElement uiElement in (IEnumerable <UIElement>) this.Children.OfType <UIElement>().OrderBy <UIElement, int>(new Func <UIElement, int>(ArrangePanel.GetOrder))) { Rect finalRect = ArrangePanel.GetPosition((DependencyObject)uiElement); if (double.IsNaN(finalRect.Top)) { finalRect = ArrangePanel.GetDesiredPosition((DependencyObject)uiElement); } uiElement.Arrange(finalRect); } return(this._strategy.ResultSize); }
private void StartReordering(MouseEventArgs e) { if (e == null || !(e.OriginalSource is UIElement originalSource)) { return; } this._startPosition = e.GetPosition((IInputElement)this); this._draggingObject = this.GetMyChildOfUiElement(originalSource); this._draggingObject.SetValue(Panel.ZIndexProperty, (object)100); Rect position = ArrangePanel.GetPosition((DependencyObject)this._draggingObject); this._delta = position.TopLeft - this._startPosition; this._draggingObject.BeginAnimation(ArrangePanel.PositionProperty, (AnimationTimeline)null); ArrangePanel.SetPosition((DependencyObject)this._draggingObject, position); }
private void StopReordering() { if (this._draggingObject == null) { return; } this._draggingObject.ClearValue(Panel.ZIndexProperty); this.InvalidateMeasure(); ArrangePanel.AnimateToPosition((DependencyObject)this._draggingObject, ArrangePanel.GetDesiredPosition((DependencyObject)this._draggingObject)); this._draggingObject = (UIElement)null; Action reOrderedEvent = this.ReOrderedEvent; if (reOrderedEvent == null) { return; } reOrderedEvent(); }
protected override Size MeasureOverride(Size availableSize) { this.InitializeEmptyOrder(); if (this._draggingObject != null) { this.ReorderOthers(); } Size[] sizes = this.MeasureChildren(); this._strategy.Calculate(availableSize, sizes); int index = -1; foreach (UIElement uiElement in (IEnumerable <UIElement>) this.Children.OfType <UIElement>().OrderBy <UIElement, int>(new Func <UIElement, int>(ArrangePanel.GetOrder))) { ++index; if (uiElement != this._draggingObject) { ArrangePanel.SetDesiredPosition((DependencyObject)uiElement, this._strategy.GetPosition(index)); } } return(this._strategy.ResultSize); }
private void ReorderOthers() { int order1 = ArrangePanel.GetOrder((DependencyObject)this._draggingObject); int num = 0; foreach (UIElement uiElement in (IEnumerable <UIElement>) this.Children.OfType <UIElement>().OrderBy <UIElement, int>(new Func <UIElement, int>(ArrangePanel.GetOrder))) { if (num == order1) { ++num; } if (uiElement != this._draggingObject) { int order2 = ArrangePanel.GetOrder((DependencyObject)uiElement); if (num != order2) { ArrangePanel.SetOrder((DependencyObject)uiElement, num); } ++num; } } }