private void root_MouseMove(object sender, MouseEventArgs e)
        {
            var element = sender as FrameworkElement;

            if (element != null && (CurrentElement == null && (bool)element.GetValue(EditModeAttachedProperty)))
            {
                ShowArrows(element);
            }

            if (!ValidateElement(element))
            {
                return;
            }


            if (_transformX || _transformY)
            {
                var minHeight = RowDefinitions.Min(rd => rd.ActualHeight);
                var minLength = ColumnDefinitions.Min(rd => rd.ActualWidth);


                var mouseDelta = Mouse.GetPosition(this);
                mouseDelta.Offset(-_mouseOffset.X, -_mouseOffset.Y);

                if (CurrentElement != null)
                {
                    var scaleY = 1 +
                                 (Math.Abs(_renderOriginY - 1.0) < double.Epsilon ? -1 : 1) * mouseDelta.Y /
                                 CurrentElement.RenderSize.Height;
                    var scaleX = 1 +
                                 (Math.Abs(_renderOriginX - 1.0) < double.Epsilon ? -1 : 1) * mouseDelta.X /
                                 CurrentElement.RenderSize.Width;

                    if (RenderSize.Height * scaleY <= minHeight || RenderSize.Width * scaleX <= minLength)
                    {
                        UnsafeMethods.SetCursorPos(_prevPosition.X, _prevPosition.Y);
                        return;
                    }

                    var scale = ((TransformGroup)CurrentElement.RenderTransform).Children.OfType <ScaleTransform>().First();
                    CurrentElement.RenderTransformOrigin = new Point(_renderOriginX, _renderOriginY);
                    if (_transformY)
                    {
                        scale.ScaleY = scaleY;
                    }

                    if (_transformX)
                    {
                        scale.ScaleX = scaleX; // < 1 ? 1.0 : scaleX;
                    }
                }
            }
            else
            {
                var mouseDelta = Mouse.GetPosition(this);
                mouseDelta.Offset(-_mouseOffset.X, -_mouseOffset.Y);

                if (element != null)
                {
                    element.Margin = new Thickness(
                        Margin.Left + mouseDelta.X,
                        Margin.Top + mouseDelta.Y,
                        Margin.Right - mouseDelta.X,
                        Margin.Bottom - mouseDelta.Y);
                }
            }

            UnsafeMethods.GetCursorPos(ref _prevPosition);


            int col;
            int row;

            GetPosition(out col, out row);


            //  notify about all movements
            if (ControlChanging != null)
            {
                var newState = GetCurrentControlState(element, col, row);
                OnControlChanging(newState, CheckCollisions(newState));
            }
            e.Handled = true;
        }