Я пытаюсь сделать так, чтобы пользователь перетаскивал клон оригинального элемента управления
У меня есть рекламщик, который отображает клон элемента управления в нижней части курсора при его перетаскивании.Как я могу расположить украшателя в точке курсора.В идеале, начиная с точной позиции, исходный элемент управления позиционируется.
Мой код 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);
}
Примечание: я перетаскиваю элемент управления с одной панели на другую.Вот почему я подключаю событие окна, чтобы зафиксировать положение мыши в любом месте окна.