/// <summary>
        /// Updates the X and Y properties based on the current rendered position of the associated element.
        /// </summary>
        private void UpdatePosition()
        {
            GeneralTransform elementToRoot = this.AssociatedObject.TransformToVisual(this.RootElement);
            Point            translation   = MouseDragElementBehavior.GetTransformOffset(elementToRoot);

            this.X = translation.X;
            this.Y = translation.Y;
        }
 /// <summary>
 /// Attempts to update the position of the associated element to the specified coordinates.
 /// </summary>
 /// <param name="point">The desired position of the element in root coordinates.</param>
 private void UpdatePosition(Point point)
 {
     if (!this.settingPosition && this.AssociatedObject != null)
     {
         GeneralTransform elementToRoot = this.AssociatedObject.TransformToVisual(this.RootElement);
         Point            translation   = MouseDragElementBehavior.GetTransformOffset(elementToRoot);
         double           xChange       = double.IsNaN(point.X) ? 0 : point.X - translation.X;
         double           yChange       = double.IsNaN(point.Y) ? 0 : point.Y - translation.Y;
         this.ApplyTranslation(xChange, yChange);
     }
 }
        /// <summary>
        /// Applies a relative position translation to the associated element.
        /// </summary>
        /// <param name="x">The X component of the desired translation in root coordinates.</param>
        /// <param name="y">The Y component of the desired translation in root coordinates.</param>
        private void ApplyTranslation(double x, double y)
        {
            if (this.ParentElement != null)
            {
                GeneralTransform rootToParent     = this.RootElement.TransformToVisual(this.ParentElement);
                Point            transformedPoint = MouseDragElementBehavior.TransformAsVector(rootToParent, x, y);
                x = transformedPoint.X;
                y = transformedPoint.Y;

                if (this.ConstrainToParentBounds)
                {
                    FrameworkElement parentElement = this.ParentElement;
                    Rect             parentBounds  = new Rect(0, 0, parentElement.ActualWidth, parentElement.ActualHeight);

                    GeneralTransform objectToParent    = this.AssociatedObject.TransformToVisual(parentElement);
                    Rect             objectBoundingBox = this.ElementBounds;
                    objectBoundingBox = objectToParent.TransformBounds(objectBoundingBox);

                    Rect endPosition = objectBoundingBox;
                    endPosition.X += x;
                    endPosition.Y += y;

                    if (!MouseDragElementBehavior.RectContainsRect(parentBounds, endPosition))
                    {
                        if (endPosition.X < parentBounds.Left)
                        {
                            double diff = endPosition.X - parentBounds.Left;
                            x -= diff;
                        }
                        else if (endPosition.Right > parentBounds.Right)
                        {
                            double diff = endPosition.Right - parentBounds.Right;
                            x -= diff;
                        }

                        if (endPosition.Y < parentBounds.Top)
                        {
                            double diff = endPosition.Y - parentBounds.Top;
                            y -= diff;
                        }
                        else if (endPosition.Bottom > parentBounds.Bottom)
                        {
                            double diff = endPosition.Bottom - parentBounds.Bottom;
                            y -= diff;
                        }
                    }
                }

                this.ApplyTranslationTransform(x, y);
            }
        }
        private static void OnConstrainToParentBoundsChanged(object sender, DependencyPropertyChangedEventArgs args)
        {
            MouseDragElementBehavior b = (MouseDragElementBehavior)sender;

            b.UpdatePosition(new Point(b.X, b.Y));
        }
        private static void OnYChanged(object sender, DependencyPropertyChangedEventArgs args)
        {
            MouseDragElementBehavior dragBehavior = (MouseDragElementBehavior)sender;

            dragBehavior.UpdatePosition(new Point(dragBehavior.X, (double)args.NewValue));
        }