Как разместить DragDrop Adorner на кончике курсора? - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь сделать так, чтобы пользователь перетаскивал клон оригинального элемента управления

У меня есть рекламщик, который отображает клон элемента управления в нижней части курсора при его перетаскивании.Как я могу расположить украшателя в точке курсора.В идеале, начиная с точной позиции, исходный элемент управления позиционируется.

Мой код Adorner выглядит следующим образом:

    class MyAdorner : Adorner
    {
        private Control _control;
        private double _x_offset = 0;
        private double _y_offset = 0;

        public MyAdorner(Control control) : base(control)
        {
            IsHitTestVisible = false;
            _control = control;
            AddVisualChild(_control);
        }

        public void UpdatePosition(double x, double y)
        {
            _x_offset = x;
            _y_offset = y;
            AdornerLayer layer = Parent as AdornerLayer;
            if (layer != null)
            {
                layer.Update(AdornedElement);
            }
        }

        protected override Size MeasureOverride(Size constraint)
        {
            _control.Measure(constraint);
            return _control.DesiredSize;

        }
        protected override Size ArrangeOverride(Size finalSize)
        {
            _control.Arrange(new Rect(finalSize));
            return finalSize;
        }

        protected override int VisualChildrenCount
        {
            get { return 1; }
        }

        protected override Visual GetVisualChild(int index)
        {
            return _control;
        }

        public override GeneralTransform GetDesiredTransform(GeneralTransform transform)
        {
            var animationDuration = TimeSpan.FromSeconds(0);
            var translate_transform = new TranslateTransform();

            translate_transform.BeginAnimation(TranslateTransform.XProperty,
                new DoubleAnimation(_x_offset, new Duration(animationDuration)));

            translate_transform.BeginAnimation(TranslateTransform.YProperty,
                new DoubleAnimation(_y_offset, new Duration(animationDuration)));

            return translate_transform;

        }
    }

И я создаю его так:

protected override void OnPreviewMouseMove(MouseEventArgs e)
{
    base.OnMouseMove(e);
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        AdornerLayer ad_layer = AdornerLayer.GetAdornerLayer(this);
        _adorner = new MyAdorner(new MyControl());
        ad_layer.Add(_adorner);

        Visibility = Visibility.Hidden;
        _window.DragOver += _window_DragOver;
        DragDrop.DoDragDrop(this, "data", DragDropEffects.All);
        Visibility = Visibility.Visible;
        ad_layer.Remove(_adorner);
    }
}

private void _window_DragOver(object sender, DragEventArgs e)
{
    Point pos = e.GetPosition(sender as Window);
    _adorner.UpdatePosition(pos.X, pos.Y);
}

Примечание: я перетаскиваю элемент управления с одной панели на другую.Вот почему я подключаю событие окна, чтобы зафиксировать положение мыши в любом месте окна.

...