Перетаскивание пользовательского элемента управления WPF - PullRequest
6 голосов
/ 08 июня 2011

Я создал движимое 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}}">
....

код

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

Если я изменю код с

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

до

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

Я могу переместить UserControl, но мышь и UserControl не совпадают

Ответы [ 3 ]

14 голосов
/ 09 июня 2011

Доброе утро. Я спал и могу думать)))

 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;
            }
        }
6 голосов
/ 09 июня 2011

Я действительно не уверен, что именно вы пытаетесь достичь в своем вопросе, но большие пальцы намного легче перетаскивать движениями. Вы можете увидеть объяснение и пример кода (внизу) здесь .

0 голосов
/ 13 июля 2017

На основе информации в @ Посредник ответ.Я пришел и отредактировал, чтобы предотвратить выход элемента управления за пределы.

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

Но ошибки привязки есть в окне вывода в VS. Похоже, что это проблема в WPF, но Microsoft ее не исправит. Для получения дополнительной информации здесь:https://connect.microsoft.com/VisualStudio/feedback/details/1423399/system-windows-data-error-4-when-using-relativesource-findancestor-inside-a-translatetransform-inside-a-style

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...