我终于做到了,
假设我想在屏幕上拖动一个 boxview 而没有任何闪烁或协调精度问题,
我为要在屏幕上拖动的视图创建了一个容器,创建了一个
DragEnd 事件和特定的 EventArgs,当这个事件在主窗体中引发时,我从布局的子列表中删除了这个容器,并重新添加了一个带有 EventArgs 携带的数据的新容器:
PanContainer.cs :
public class PanContainer : ContentView
{
public delegate void DragEndEventHandler(object sender, DragEventArgs e);
public PanContainer()
{
var panGesture = new PanGestureRecognizer();
panGesture.PanUpdated += OnPanUpdated;
GestureRecognizers.Add(panGesture);
}
public event DragEndEventHandler DragEnd;
private void OnPanUpdated(object sender, PanUpdatedEventArgs e)
{
switch (e.StatusType)
{
case GestureStatus.Running:
Content.TranslationX = e.TotalX;
Content.TranslationY = e.TotalY;
break;
case GestureStatus.Completed:
OnDragEnd(new DragEventArgs(Content.TranslationX, Content.TranslationY, Width, Height, X, Y));
break;
case GestureStatus.Started:
break;
case GestureStatus.Canceled:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
protected virtual void OnDragEnd(DragEventArgs e)
{
DragEnd?.Invoke(this, e);
}
}
public class DragEventArgs : EventArgs
{
public DragEventArgs(double translationX, double translationY, double w, double h, double x, double y)
{
ContentTranslationX = translationX;
ContentTranslationY = translationY;
Width = w;
Height = h;
X = x;
Y = y;
}
public double ContentTranslationX { get; set; }
public double ContentTranslationY { get; set; }
public double Width { get; set; }
public double Height { get; set; }
public double X { get; set; }
public double Y { get; set; }
}
在主窗体中:
private void DraggableOnDragEnd(object sender, DragEventArgs e)
{
var bv = new BoxView
{
BackgroundColor = Color.Brown
};
var pc = new PanContainer
{
Padding = 4,
BackgroundColor = Color.Chartreuse,
Content = bv
};
absoluteLayout.Children.Add(pc,
new Rectangle(e.X + e.ContentTranslationX, e.Y + e.ContentTranslationY, e.Width, e.Height));
Task.Run(() =>
{
Device.BeginInvokeOnMainThread(() =>
{
absoluteLayout.Children.Remove(
absoluteLayout.Children.First(x => x.GetType() == typeof(PanContainer)));
var v = absoluteLayout.Children.First(x => x.GetType() == typeof(PanContainer));
((PanContainer) v).DragEnd += DraggableOnDragEnd;
});
});
}
enter image description here
它工作正常,但也许有更好的方法来做到这一点..