开发者

Dragging a WPF user control

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 mou开发者_StackOverflow社区se and UserControl do not match


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;
            }
        }


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.


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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜