在UWP Xamarin Forms中,如果PanGesture只调用一次,并且拖动不起作用,可能是因为没有正确处理PanGesture的更新事件。下面是一个示例代码,展示如何在UWP Xamarin Forms中正确处理PanGesture的更新事件:
using Xamarin.Forms;
using Xamarin.Forms.Platform.UWP;
[assembly: ExportRenderer(typeof(View), typeof(CustomRenderer))]
namespace YourNamespace
{
public class CustomRenderer : ViewRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<View> e)
{
base.OnElementChanged(e);
if (Control != null)
{
// 添加PanGesture的处理
Control.ManipulationMode = Windows.UI.Xaml.Input.ManipulationModes.All;
Control.ManipulationDelta += Control_ManipulationDelta;
Control.ManipulationCompleted += Control_ManipulationCompleted;
}
}
private void Control_ManipulationDelta(object sender, Windows.UI.Xaml.Input.ManipulationDeltaRoutedEventArgs e)
{
// 处理PanGesture的更新事件
if (Element is View view)
{
var panGesture = view.GestureRecognizers.FirstOrDefault(g => g is PanGestureRecognizer) as PanGestureRecognizer;
if (panGesture != null && panGesture.PanUpdatedCommand != null && panGesture.PanUpdatedCommand.CanExecute(null))
{
var panEventArgs = new PanUpdatedEventArgs(GestureStatus.Running, e.Cumulative.Translation.X, e.Cumulative.Translation.Y);
panGesture.PanUpdatedCommand.Execute(panEventArgs);
}
}
}
private void Control_ManipulationCompleted(object sender, Windows.UI.Xaml.Input.ManipulationCompletedRoutedEventArgs e)
{
// 处理PanGesture的完成事件
if (Element is View view)
{
var panGesture = view.GestureRecognizers.FirstOrDefault(g => g is PanGestureRecognizer) as PanGestureRecognizer;
if (panGesture != null && panGesture.PanUpdatedCommand != null && panGesture.PanUpdatedCommand.CanExecute(null))
{
var panEventArgs = new PanUpdatedEventArgs(GestureStatus.Completed);
panGesture.PanUpdatedCommand.Execute(panEventArgs);
}
}
}
}
}
在上面的示例代码中,我们创建了一个自定义渲染器(CustomRenderer),并在OnElementChanged方法中添加了PanGesture的处理。我们通过ManipulationMode属性将控件的ManipulationMode设置为All,以便可以处理拖动手势。然后,我们订阅了Control的ManipulationDelta事件和ManipulationCompleted事件,并在事件处理程序中触发PanGesture的更新事件。
请注意,上面的示例代码假设您已经在Xamarin Forms中添加了一个PanGestureRecognizer,并将其与相应的PanUpdatedCommand绑定。