/// <summary> /// Moves the Target. /// </summary> /// <remarks> /// This method checks the constraints (MinLeft, MaxLeft, etc) before moving the Target, /// and raises related events if it is required. /// </remarks> /// <param name="deltaX">The X distance to move.</param> /// <param name="deltaY">The Y distance to move.</param> /// <returns>True if the Target is actually moved.</returns> public bool Move(double deltaX, double deltaY) { if (Target == null) return false; if (Target.IsLoaded == false) return false; var delta = new Vector(deltaX, deltaY); // Adjusts the delta not to exceed the defined min-max positions. AdjustDeltaForMinMaxPositions(ref delta); // Raises the Moving event. if (!RaiseMovingEvent(this, Target, ref delta)) return false; // Moves the target element. bool isMoved = FrameworkElementHelper.Move(Target, delta); // Raises the Moved event. RaiseMovedEvent(this, Target, delta); return isMoved; }
/// <summary> /// Adjusts the delta not to exceed the defined min-max positions. /// </summary> /// <param name="dragDelta">The drag delta to adjust.</param> private void AdjustDeltaForMinMaxPositions(ref Vector dragDelta) { if (Target == null) return; // To use layout related properties the Target must be loaded. if (!Target.IsLoaded) return; // Gets the Target's left and top. double targetLeft, targetTop; if (Target is Window window) { targetLeft = window.Left; targetTop = window.Top; } else { targetLeft = FrameworkElementHelper.GetCanvasLeft(Target); targetTop = FrameworkElementHelper.GetCanvasTop(Target); } // Gets the Target's width and height. double targetWidth = Target.ActualWidth; double targetHeight = Target.ActualHeight; // Adjusts the delta for the defined min-max positions. if (targetLeft + targetWidth + dragDelta.X > MaxRight) dragDelta.X = MaxRight - targetLeft - targetWidth; if (targetLeft + targetWidth + dragDelta.X < MinRight) dragDelta.X = MinRight - targetLeft - targetWidth; if (targetTop + targetHeight + dragDelta.Y > MaxBottom) dragDelta.Y = MaxBottom - targetTop - targetHeight; if (targetTop + targetHeight + dragDelta.Y < MinBottom) dragDelta.Y = MinBottom - targetTop - targetHeight; if (targetLeft + dragDelta.X > MaxLeft) dragDelta.X = MaxLeft - targetLeft; if (targetLeft + dragDelta.X < MinLeft) dragDelta.X = MinLeft - targetLeft; if (targetTop + dragDelta.Y > MaxTop) dragDelta.Y = MaxTop - targetTop; if (targetTop + dragDelta.Y < MinTop) dragDelta.Y = MinTop - targetTop; }
/// <summary> /// Adjusts not to exceed the defined min-max positions. /// </summary> private void AdjustForMinMaxPositions() { if (Target == null) return; if (Target.IsLoaded == false) return; // Gets the delta that is not exceed the defined min-max positions. Vector delta = new Vector(); AdjustDeltaForMinMaxPositions(ref delta); // Applies the delta. FrameworkElementHelper.Move(Target, delta); }
/// <summary> /// Resizes the target. /// </summary> /// <param name="mode">The resize mode.</param> /// <param name="e">The event arguments.</param> private void Resize(BorderResizeMode mode, DragDeltaEventArgs e) { if (Target == null) { return; } // Converts the DragDeltaEventArgs into a Vector. Vector dragDelta = new Vector(e.HorizontalChange, e.VerticalChange); // Raises the Resizing event. if (!RaiseResizingEvent(this, Target, mode, ref dragDelta)) { return; } // Resizes the target element. FrameworkElementHelper.Resize(Target, mode, dragDelta); // Raises the Resized event. RaiseResizedEvent(this, Target, mode, dragDelta); }