Xamarin Forms junta e junta

Eu implementei pan e beliscar individualmente, e funciona bem. Agora estou tentando usar pitada e pan juntos e estou vendo alguns problemas. Aqui está o meu código:

XAML:

<AbsoluteLayout x:Name="PinchZoomContainer">
  <controls:NavBar x:Name="NavBar" ShowPrevNext="true" ShowMenu="false" IsModal="true" />
  <controls:PanContainer  x:Name="PinchToZoomContainer">
    <Image x:Name="ImageMain" />
  </controls:PanContainer>
</AbsoluteLayout>

Adição de pitada / movimento panorâmico:

var panGesture = new PanGestureRecognizer();
panGesture.PanUpdated += OnPanUpdated;
GestureRecognizers.Add(panGesture);

var pinchGesture = new PinchGestureRecognizer();
pinchGesture.PinchUpdated += OnPinchUpdated;
GestureRecognizers.Add(pinchGesture);

Método Pan:

void OnPanUpdated(object sender, PanUpdatedEventArgs e)
{
    switch (e.StatusType)
    {
        case GestureStatus.Started:
            startX = e.TotalX;
            startY = e.TotalY;
            Content.AnchorX = 0;
            Content.AnchorY = 0;

            break;
        case GestureStatus.Running:
            // Translate and ensure we don't pan beyond the wrapped user interface element bounds.
            Content.TranslationX = Math.Max(Math.Min(0, x + e.TotalX), -Math.Abs(Content.Width - App.ScreenWidth));
            Content.TranslationY = Math.Max(Math.Min(0, y + e.TotalY), -Math.Abs(Content.Height - App.ScreenHeight));
            break;

        case GestureStatus.Completed:
            // Store the translation applied during the pan
            x = Content.TranslationX;
            y = Content.TranslationY;
            break;
    }
}

Método pitada:

void OnPinchUpdated(object sender, PinchGestureUpdatedEventArgs e)
{
    if (e.Status == GestureStatus.Started)
    {
        // Store the current scale factor applied to the wrapped user interface element,
        // and zero the components for the center point of the translate transform.
        startScale = Content.Scale;
        //ImageMain.AnchorX = 0;
        //ImageMain.AnchorY = 0;
    }
    if (e.Status == GestureStatus.Running)
    {
        // Calculate the scale factor to be applied.
        currentScale += (e.Scale - 1) * startScale;
        currentScale = Math.Max(1, currentScale);
        currentScale = Math.Min(currentScale, 2.5);
        // The ScaleOrigin is in relative coordinates to the wrapped user interface element,
        // so get the X pixel coordinate.
        double renderedX = Content.X + xOffset;
        double deltaX = renderedX / Width;
        double deltaWidth = Width / (Content.Width * startScale);
        double originX = (e.ScaleOrigin.X - deltaX) * deltaWidth;

        // The ScaleOrigin is in relative coordinates to the wrapped user interface element,
        // so get the Y pixel coordinate.
        double renderedY = Content.Y + yOffset;
        double deltaY = renderedY / Height;
        double deltaHeight = Height / (Content.Height * startScale);
        double originY = (e.ScaleOrigin.Y - deltaY) * deltaHeight;

        // Calculate the transformed element pixel coordinates.
        double targetX = xOffset - (originX * Content.Width) * (currentScale - startScale);
        double targetY = yOffset - (originY * Content.Height) * (currentScale - startScale);

        // Apply translation based on the change in origin.
        Content.TranslationX = targetX.Clamp(-Content.Width * (currentScale - 1), 0);
        Content.TranslationY = targetY.Clamp(-Content.Height * (currentScale - 1), 0);

        // Apply scale factor
        Content.Scale = currentScale;
    }
    if (e.Status == GestureStatus.Completed)
    {
        // Store the translation delta's of the wrapped user interface element.
        xOffset = Content.TranslationX;
        yOffset = Content.TranslationY;
    }
}

Se eu desativar um gesto e usar apenas o outro, a funcionalidade funcionará perfeitamente. O problema surge quando adiciono os gestos pan e beliscar. O que parece estar acontecendo é o seguinte:

1) A panorâmica realmente parece estar funcionando conforme o esperado 2) Quando você faz a panorâmica da imagem inicialmente, digamos, mova a imagem para o centro Y e o centro X e, em seguida, tenta aplicar zoom, a imagem volta ao seu estado original. Estado inicial. Então, quando você faz o pan, você volta para onde estava antes de tentar ampliar (e é por isso que digo que o pan está funcionando bem).

Pelo que entendi da minha depuração, é que quando você aumenta o zoom, não leva em consideração a posição em que está atualmente. Portanto, quando você faz o movimento panorâmico primeiro e depois o zoom, ele não amplia a posição em que está, mas o ponto inicial da imagem. Então, quando você tenta fazer o movimento panorâmico a partir daí, o método de movimento ainda se lembra de onde você estava e o leva de volta para onde estava antes de tentar ampliar.

Esperando ter alguma ideia disso. Obviamente, há um problema com o meu método de pitada. Eu acho que (obviamente não consigo descobrir) eu preciso adicionar lógica nela, que leve em consideração onde você está atualmente.

questionAnswers(3)

yourAnswerToTheQuestion