2016-04-07 12 views

Antwort

0

Sie können versuchen, die Scale API auf der Seite Inhalt zu verwenden. Dies schien mir bei einer kleinen Test-App zu funktionieren.

public App() 
{ 
    // The root page of your application 
    var scaleUp = new Button { 
     Text = "Scale Up" 
    }; 
    scaleUp.Clicked += (sender, e) => { 
     this.MainPage.Scale += 1; 
    }; 

    var scaleDown = new Button { 
     Text = "Scale Down" 
    }; 
    scaleDown.Clicked += (object sender, EventArgs e) => { 
     this.MainPage.Scale -= 1; 
    }; 

    MainPage = new ContentPage { 
     Content = new StackLayout { 
      VerticalOptions = LayoutOptions.Center, 
      Children = { 
       scaleUp, 
       scaleDown 

      } 
     } 
    }; 
} 

Before

After

+0

Wenn Sie die Tasten auf der Unterseite der Seite setzen, wird sie sich bewegen aus der Sicht, wie Sie die Ansicht vergrößern? –

+0

@WilliamCorncobDecker Ich habe Bilder hinzugefügt, um zu zeigen, was es macht. –

+0

Ich bin nur besorgt, dass dies in der Praxis keine machbare Option ist. Die meisten Leute wollen keine Buttons in der Mitte ihrer Layouts, sie würden sie am oberen oder unteren Bildschirmrand haben wollen. In diesen Fällen würden sich die Schaltflächen schnell aus dem sichtbaren Bereich bewegen. –

1

Versuchen Sie, diese Klasse, diese Lösung nicht bewegen, wenn Sie vergrößern oder verkleinern. Quelle hier: Source Code

public class PinchToZoomContainer : ContentView { 
    double currentScale = 1; 
    double startScale = 1; 
    double xOffset = 0; 
    double yOffset = 0; 

    public PinchToZoomContainer() 
    { 
     var pinchGesture = new PinchGestureRecognizer(); 
     pinchGesture.PinchUpdated += OnPinchUpdated; 
     GestureRecognizers.Add (pinchGesture); 
    } 

    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; 
      Content.AnchorX = 0; 
      Content.AnchorY = 0; 
     } 
     if (e.Status == GestureStatus.Running) { 
      // Calculate the scale factor to be applied. 
      currentScale += (e.Scale - 1) * startScale; 
      currentScale = Math.Max (1, currentScale); 

      // 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; 
     } 
    } 
} 

Helper DoubleExtensions

public static class DoubleExtensions 
{ 
    public static double Clamp (this double self, double min, double max) 
    { 
     return Math.Min (max, Math.Max (self, min)); 
    } 
} 
Verwandte Themen