Dragging a WPF user control

2020-03-03 04:54发布

问题:

I created a movable UserControl

    <UserControl x:Class="Restaurant.Views.Managerer.TablePanel"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Restaurant.Helpers.Converter"
        mc:Ignorable="d"
        x:Name="root"
        MouseLeftButtonDown="root_MouseLeftButtonDown"
        MouseLeftButtonUp="root_MouseLeftButtonUp"
        MouseMove="root_MouseMove"    
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
....

Code

Point anchorPoint;
        Point currentPoint;
        bool isInDrag = false;

        private void root_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            var element = sender as FrameworkElement;
            anchorPoint = e.GetPosition(null);
            element.CaptureMouse();
            isInDrag = true;
            e.Handled = true;
        }

        private void root_MouseMove(object sender, MouseEventArgs e)
        {
            if (isInDrag)
            {
                var element = sender as FrameworkElement;
                currentPoint = e.GetPosition(null);

                var transform = new TranslateTransform
                                    {
                                        X = (currentPoint.X - anchorPoint.X),
                                        Y = (currentPoint.Y - anchorPoint.Y)
                                    };
                this.RenderTransform = transform;
                anchorPoint = currentPoint;
            }
        }

        private void root_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            if (isInDrag)
            {
                var element = sender as FrameworkElement;
                element.ReleaseMouseCapture();
                isInDrag = false;
                e.Handled = true;
            }
        }

If I change the code from

X = (currentPoint.X - anchorPoint.X),
Y = (currentPoint.Y - anchorPoint.Y)

to

X = (currentPoint.X),
Y = (currentPoint.Y)

I can move the UserControl, but the mouse and UserControl do not match

回答1:

Good morning. I slept and can think )))

 private TranslateTransform transform = new TranslateTransform();
        private void root_MouseMove(object sender, MouseEventArgs e)
        {
            if (isInDrag)
            {
                var element = sender as FrameworkElement;
                currentPoint = e.GetPosition(null);

                transform.X += currentPoint.X - anchorPoint.X;
                transform.Y += (currentPoint.Y - anchorPoint.Y);
                this.RenderTransform = transform;
                anchorPoint = currentPoint;
            }
        }


回答2:

I really am not sure what exactly you're trying to accomplish in your question but Thumbs are much easier for dragging motions. You can see an explanation and sample code (at the bottom) here.



回答3:

Based upon information in @Mediator answer. I have came up and edited to prevent the control from going out of bounds.

private TranslateTransform transform = new TranslateTransform();
    private void root_MouseMove(object sender, MouseEventArgs e)
    {
        if (isInDrag)
        {
            var element = sender as FrameworkElement;
            currentPoint = e.GetPosition(null);

            transform.X += currentPoint.X - anchorPoint.X;
            transform.Y += (currentPoint.Y - anchorPoint.Y);
            if (currentPoint.X < Application.Current.MainWindow.RenderSize.Width && currentPoint.Y < Application.Current.MainWindow.RenderSize.Height
                && currentPoint.X > 0 && currentPoint.Y > 0 )
            {
                this.RenderTransform = transform;
                anchorPoint = currentPoint;
            }
            else
            {
                transform = new TranslateTransform();
                this.RenderTransform = transform;
            }
        }
    }

But binding errors are their in output window in VS.

It looks like this is an issue in WPF, but one that Microsoft won't fix.

For more info here:

https://connect.microsoft.com/VisualStudio/feedback/details/1423399/system-windows-data-error-4-when-using-relativesource-findancestor-inside-a-translatetransform-inside-a-style