Xamarin 在两个布局之间交换子布局<;视图>;

Xamarin 在两个布局之间交换子布局<;视图>;,xamarin,xamarin.forms,xamarin.android,Xamarin,Xamarin.forms,Xamarin.android,我正在为iOS、Android和UWP开发Xamarin。我创建了一个名为DragAndSwapContainer的自定义控件,它实现了两种自定义行为:DragBehavior和DropBehavior DragBehavior基本上为视图添加了一个PangestureRecognitor,并在“拖动”视图时发出一个事件(还根据用户完成的平移转换视图)。另一方面,DropBehavior侦听此事件,并在视图经过容器或将视图放入容器时发出其他事件 DragAndSwapContainer充当可以接

我正在为iOS、Android和UWP开发Xamarin。我创建了一个名为DragAndSwapContainer的自定义控件,它实现了两种自定义行为:DragBehavior和DropBehavior

DragBehavior基本上为视图添加了一个PangestureRecognitor,并在“拖动”视图时发出一个事件(还根据用户完成的平移转换视图)。另一方面,DropBehavior侦听此事件,并在视图经过容器或将视图放入容器时发出其他事件

DragAndSwapContainer充当可以接收其他视图的容器,同时充当可拖放视图。该容器的目标是通过将一个视图拖放到另一个视图中,使用户能够在两个视图之间切换

当一个视图被放置在这个容器中时,我所做的基本上是交换两个容器的子视图(一个包含被拖动的视图,另一个接收被放置的视图)。 下面是DragAndSwapContainer(从Grid继承)的一段代码:

因为每个视图只能有一个父视图,所以这样做很好:子视图由DragAndSwapContainers交换

就iOS和Windows而言,一切都很好,但我在安卓系统上遇到了一些问题

交换两个视图时出现以下错误。经过一些调试后,我得出结论,问题的出现是因为在交换子级(在children.Add的两行代码之间)时,Android本地呈现器被释放,因此我无法跟踪视图

另外,有些事情并不总是发生,似乎有一些时间问题。如果我连接我的分析服务(它向云服务器报告并增加一些开销),问题就会更频繁地发生

提到的错误似乎在我的Xamarin.Forms版本中得到了修复(因为它已经在v4.4.0中被合并),但我仍然有完全相同的错误调用堆栈


在这种情况下,有没有其他更好的方法在两个布局之间交换子布局?

您可以将XF更新到最新版本(4.8.x)并再次测试。如果问题仍然存在,您可以将样本共享给github,这样我就可以检查它。@LucasZhang MSFT我在github()中打开了一个问题,在那里我添加了一个复制样本OK,我们将关注它。我检查了您的样本,它在我的android模拟器上运行良好。顺便说一下,现在可以使用拖放手势识别器。你可以查看doc.Hi@LucasZhang MSFT,在你添加我在帖子中提到的UXCam分析之前,它工作正常。是的,我见过手势识别器,但当我开始编写时,它们是实验性的,所以我创建了自己的
private void OnViewDroppedInside(object sender, DroppedEventArgs e)
{
    var draggedViewContainer = e.DroppedView.Parent as DragAndSwapContainer;

    draggedViewContainer.Children.Add(this.Children.First());
    this.Children.Add(e.DroppedView);
}