0

So I have a control named UI_TileInformation which needs to be kept inside its parent container (a canvas), while allowing the user to drag it freely. This solution was helpful in getting it to function, it now drags perfectly fine. However, it can be dragged outside of the bounds of its container. This solution was no help as I do not see where the _transform variable comes from.

The control has the following default variables:

protected bool isDragging;
private Point clickPosition;

As well as these event handlers:

this.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(Control_MouseLeftButtonDown);
this.PreviewMouseLeftButtonUp += new MouseButtonEventHandler(Control_MouseLeftButtonUp);
this.PreviewMouseMove += new MouseEventHandler(Control_MouseMove);

I am fairly new to c# and WPF but I figured out that those event handlers would only work with when previewed (PreviewMouseMove as opposed to MouseMove)

As for the code that makes it drag, it is similar to the first link above:

private void Control_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        isDragging = true;
        var draggableControl = sender as UI_TileInformation;
        clickPosition = e.GetPosition(this);
        draggableControl.CaptureMouse();
    }
private void Control_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        isDragging = false;
        var draggableControl = sender as UI_TileInformation;
        draggableControl.ReleaseMouseCapture();
    }
private void Control_MouseMove(object sender, MouseEventArgs e)
    {
        var draggableControl = sender as UI_TileInformation;

        if (isDragging && draggableControl != null)
        {
            Point positionInUIElement = e.GetPosition(this);

            var transform = draggableControl.RenderTransform as TranslateTransform;
            if (transform == null)
            {
                transform = new TranslateTransform();
                draggableControl.RenderTransform = transform;
            }
            transform.X = positionInCanvas.X - clickPosition.X;
            transform.Y = positionInCanvas.Y - clickPosition.Y;
        }
    }

How can I get my control to stay inside the canvas?

  • If none of the rest of your form allows a Drop, then you should be getting "Not allowed" cursor and you won't be able to drop the control. This won't prevent the user from moving their cursor outside the canvas, but it clearly indicates that Drop is not allowed. – Frank Ball Mar 02 '19 at 00:00
  • The only control with AllowDrop set to True is the parent container (a canvas), however it works even when set to False which I do not understand why. – aNorseman Mar 02 '19 at 00:32

0 Answers0