PanGesture вызывает обновленное событие Pangesture только один раз в формах UWP Xamarin. Вот почему перетаскивание не выполняется - PullRequest
0 голосов
/ 23 января 2020

Я добавил Pan Gesture к изображению, используя код позади, затем в обновленном методе жеста панорамирования я назвал все его случаи.

Это происходит сразу после запуска и установил относительную координату собственного вида (изображения) в родительский вид (окно). Затем он останавливается и не выполняет какой-либо вызов метода жеста панорамирования. Ниже приведен код.

/*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 );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...