Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PanGesture在UWP Xamarin表单中只调用了一次PanGesture更新事件。这就是为什么拖动不起作用_C#_Xamarin_Xamarin.forms_Uwp_Uipangesturerecognizer - Fatal编程技术网

C# PanGesture在UWP Xamarin表单中只调用了一次PanGesture更新事件。这就是为什么拖动不起作用

C# PanGesture在UWP Xamarin表单中只调用了一次PanGesture更新事件。这就是为什么拖动不起作用,c#,xamarin,xamarin.forms,uwp,uipangesturerecognizer,C#,Xamarin,Xamarin.forms,Uwp,Uipangesturerecognizer,我已经使用代码在图像上添加了平移手势,然后在平移手势更新方法中调用了它的所有情况 它立即进入运行状态,并设置本机视图(图像)相对于父视图(窗口)的坐标。然后它停止并不执行任何对pan手势更新方法的调用 /*Creation of image*/ void CreateImage() { var panGestureRecognizer = new PanGestureRecognizer(); panGestureRecognizer.PanUpdated += PanGestu

我已经使用代码在图像上添加了平移手势,然后在平移手势更新方法中调用了它的所有情况

它立即进入运行状态,并设置本机视图(图像)相对于父视图(窗口)的坐标。然后它停止并不执行任何对pan手势更新方法的调用

/*Creation of image*/
void CreateImage() {
    var panGestureRecognizer = new PanGestureRecognizer();
    panGestureRecognizer.PanUpdated += PanGestureRecognizer_PanUpdated;
    Image image = new Image()
    {
        HeightRequest = 40,
        WidthRequest = 40,
        Margin = new Thickness( 10, 10, 10, 0 ),
        Aspect = Aspect.AspectFit,
        VerticalOptions = LayoutOptions.Start,
        Source = ImageSource.FromUri( new Uri( $"{codebookJSONModel.Violation.IconPath}" ) ),
    };
    image.GestureRecognizers.Add( panGestureRecognizer );
}

/*PanGesture Updated Event*/

private async void PanGestureRecognizer_PanUpdated( object sender, PanUpdatedEventArgs e ) {
    Console.WriteLine( "PanGestureRecognizer_PanUpdated" );
    var layout = (Image)sender;
    switch ( e.StatusType ) {
    case GestureStatus.Started:
        Console.WriteLine( "PanGestureRecognizer_Started" );
        inspectionViewModel.totalX = 0;
        inspectionViewModel.totalY = 0;
        break;

    case GestureStatus.Running:
        // Translate and ensure we don't pan beyond the wrapped user interface element bounds.
        Debug.WriteLine( "PanGestureRecognizer_Running" );
        var screenCoordinates = DependencyService.Get<ICommonDependent>().GetViewPositionInSuperView( layout, this.Content );
        inspectionViewModel.totalX = e.TotalX;
        inspectionViewModel.totalY = e.TotalY;


        Debug.WriteLine( "e.TotalX: " + e.TotalX + "e.TotalY: " + e.TotalY );
        double superViewX = screenCoordinates.x + inspectionViewModel.totalX;
        double superViewY = screenCoordinates.y + inspectionViewModel.totalY - layout.Height / 2;
        uxViolationMarkerImgView.IsVisible = true;

        Debug.WriteLine( $"x = {superViewX}, y = {superViewY}" );
        DisplayOnGoingMarkerAsView( superViewX, superViewY );
        break;

    case GestureStatus.Completed:
        // Store the translation applied during the pan
        Debug.WriteLine( "PanGestureRecognizer_Completed" );
        var lastScreenCoordinates = DependencyService.Get<ICommonDependent>().GetViewPositionInSuperView( layout, uxMapView );

        double mapViewX = lastScreenCoordinates.x + inspectionViewModel.totalX + layout.Width / 2;
        double mapViewY = lastScreenCoordinates.y + inspectionViewModel.totalY + layout.Height / 2;
        Debug.WriteLine( $"x = {mapViewX}, y = {mapViewY}" );

        uxViolationMarkerImgView.IsVisible = false;
        break;
    case GestureStatus.Canceled:
        Debug.WriteLine( "PanGestureRecognizer_Canceled" );
        uxViolationMarkerImgView.IsVisible = false;
        break;
    }
}

/*GetViewPositionInSuperView method to get child element position inside window*/

public ( double x, double y ) GetViewPositionInSuperView( Xamarin.Forms.View layout, Xamarin.Forms.View superview = null ) {
    var nativeView = Xamarin.Forms.Platform.UWP.Platform.GetRenderer( layout ).ContainerElement;
    FrameworkElement relativePositionView;
    if ( superview != null ) {
        relativePositionView = Xamarin.Forms.Platform.UWP.Platform.GetRenderer( superview ).ContainerElement;
    } else {
        relativePositionView = Window.Current.Content as Frame;
    }

    var element_Visual_Relative = nativeView.TransformToVisual( relativePositionView );
    ///element_Visual_Relative.TransformPoint(new Point(0, 0));

    Rect rectangle = element_Visual_Relative.TransformBounds( new Rect( new Point( nativeView.Margin.Left, nativeView.Margin.Top ), nativeView.RenderSize ) );

    Console.WriteLine( $"NativeX: {rectangle.X} NativeY: {rectangle.Y}" );
    return ( rectangle.X, rectangle.Y );
}
/*创建图像*/
void CreateImage(){
var pangestruerecognizer=新的pangestruerecognizer();
pangestrerecognizer.PanUpdated+=pangestrerecognizer\u PanUpdated;
图像=新图像()
{
HeightRequest=40,
宽度请求=40,
余量=新厚度(10,10,10,0),
Aspect=Aspect.AspectFit,
垂直选项=布局选项。开始,
Source=ImageSource.FromUri(新Uri($“{codebookJSONModel.Violation.IconPath}”),
};
image.gestureignizers.Add(pangestureignizer);
}
/*PanGesture更新事件*/
私有异步void PangestureRecognitor_PanUpdated(对象发送方,PanUpdatedEventArgs e){
Console.WriteLine(“PangestureRecognitizer_PanUpdate”);
变量布局=(图像)发送方;
开关(如状态类型){
案例手势状态。已启动:
Console.WriteLine(“PangestureRecognitizer_启动”);
inspectionViewModel.totalX=0;
inspectionViewModel.totalY=0;
打破
案例手势状态。正在运行:
//翻译并确保平移不会超出包装的用户界面元素边界。
Debug.WriteLine(“PangestureRecognitor_Running”);
var screencordinates=DependencyService.Get().GetViewPositionInsPerView(布局,this.Content);
inspectionViewModel.totalX=e.totalX;
inspectionViewModel.totalY=e.totalY;
Debug.WriteLine(“e.TotalX:+e.TotalX+”e.TotalY:+e.TotalY);
双superViewX=屏幕坐标.x+检查视图模型.totalX;
双视图y=屏幕坐标.y+检查视图模型.totalY-布局.Height/2;
uxViolationMarkerImgView.IsVisible=true;
Debug.WriteLine($“x={superViewX},y={superViewY}”);
显示OingOingMarkerasView(superViewX、superViewY);
打破
案例管理状态。已完成:
//存储平移期间应用的平移
Debug.WriteLine(“PangestureRecognitizer_已完成”);
var lastScreenCoordinates=DependencyService.Get().GetViewPositionInsPerView(布局,uxMapView);
double mapViewX=lastScreenCoordinates.x+inspectionViewModel.totalX+layout.Width/2;
double mapViewY=lastScreenCoordinates.y+inspectionViewModel.Total+layout.Height/2;
Debug.WriteLine($“x={mapViewX},y={mapViewY}”);
uxViolationMarkerImgView.IsVisible=false;
打破
案例手势状态。已取消:
Debug.WriteLine(“PangestureRecognitizer_已取消”);
uxViolationMarkerImgView.IsVisible=false;
打破
}
}
/*获取窗口内子元素位置的GetViewPositionInsPerView方法*/
public(双x,双y)GetViewPositionInsPerView(Xamarin.Forms.View布局,Xamarin.Forms.View superview=null){
var nativeView=Xamarin.Forms.Platform.UWP.Platform.GetRenderer(布局).ContainerElement;
框架元素相对位置视图;
如果(superview!=null){
relativePositionView=Xamarin.Forms.Platform.UWP.Platform.GetRenderer(superview).ContainerElement;
}否则{
relativePositionView=Window.Current.Content作为框架;
}
var element_Visual_Relative=nativeView.TransformToVisual(relativePositionView);
///元素可视相对转换点(新点(0,0));
Rect rectangle=element_Visual_Relative.TransformBounds(新Rect(新点(nativeView.Margin.Left,nativeView.Margin.Top),nativeView.RenderSize));
WriteLine($“NativeX:{rectangle.X}NativeY:{rectangle.Y}”);
返回值(矩形.X,矩形.Y);
}

它只是在uwp中有问题吗?它在其他平台上只发射一次吗?它只是在uwp Xamarin.forms中发生的,在其他平台(如ios)上工作正常。