2015-08-22 13 views
6

Ich verwende Xamarin.Forms, um eine Cross-Plattform-Anwendung zu erstellen. Alle meine ContentPages befinden sich innerhalb der PCL.So legen Sie die Ausrichtung von ContentPage in Xamarin.Forms fest

Ich bin auf der Suche nach einer Möglichkeit zum Festlegen und Sperren der orientation einer einzigen ContentPage zu Landscape, vorzugsweise ohne eine andere Aktivität in jedem der Plattform spezifischen Projekten zu erstellen.

Da mein ContentPage.Content auf eine ScrollView gesetzt ist, habe ich versucht, dies funktionierte nicht aber die ScrollOrientation-Horizontal Einstellung.

Ich habe auch versucht, eine RelativeLayout, aber ich kann keine Orientation Eigenschaft auf diesem zu sehen.

public class PlanningBoardView : ContentPage //Container Class. 
    { 
     public PlanningBoardView() 
     { 
      scroller = new ScrollView(); 

      Board = new PlanningBoard(); 

      scroller.Orientation = ScrollOrientation.Horizontal; 
      scroller.WidthRequest = Board.BoardWidth; 
      scroller.Content = Board; 

      Content = scroller; 
     } 
    } 

Das letzte, was ich versuchte, wurde Xamarin Studio-Version von IntelliSense und die Xamarin Forms API Doc's durch die verschiedene Layouts zur Verfügung zu mir suchen, von denen keiner hatte eine Orientation Eigenschaft.

Ich fürchte, der einzige Weg, dies zu tun ist, indem Sie eine zweite Plattform spezifische Activity nur für diese ContentPage erstellen und die Ausrichtung auf Landschaft setzen.

Obwohl diese Methode funktionieren würde, macht es die Navigation zwischen den Bildschirmen sehr viel komplexer.

Dies wird derzeit in Android getestet.

Antwort

12

Hass, dies zu sagen, aber dies kann nur custom renderers oder ein plattformspezifischen Code

In Android verwendet getan werden, können Sie die RequestedOrientation Eigenschaft des MainActivity auf ScreenOrientation.Landscape einstellen.

In iOS können Sie GetSupportedInterfaceOrientations in der AppDelegate Klasse überschreiben eine der UIInterfaceOrientationMask Werte zurück, wenn Xamarin.Forms.Application.Current.MainPage die ContentPage ist, dass Sie in intereted.



Android

[assembly: Xamarin.Forms.ExportRenderer(typeof(MyCustomContentPage), typeof(CustomContentPageRenderer))] 

public class CustomContentPageRenderer : Xamarin.Forms.Platform.Android.PageRenderer 
{ 
    private ScreenOrientation _previousOrientation = ScreenOrientation.Unspecified; 

    protected override void OnWindowVisibilityChanged(ViewStates visibility) 
    { 
     base.OnWindowVisibilityChanged(visibility); 

     var activity = (Activity)Context; 

     if (visibility == ViewStates.Gone) 
     { 
      // Revert to previous orientation 
      activity.RequestedOrientation = _previousOrientation == ScreenOrientation.Unspecified ? ScreenOrientation.Portrait : _previousOrientation; 
     } 
     else if (visibility == ViewStates.Visible) 
     { 
      if (_previousOrientation == ScreenOrientation.Unspecified) 
      { 
       _previousOrientation = activity.RequestedOrientation; 
      } 

      activity.RequestedOrientation = ScreenOrientation.Landscape; 
     } 
    } 
} 

iOS

public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate 
{ 
    public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations(UIApplication application, UIWindow forWindow) 
    { 
     if (Xamarin.Forms.Application.Current == null || Xamarin.Forms.Application.Current.MainPage == null) 
     { 
      return UIInterfaceOrientationMask.Portrait; 
     } 

     var mainPage = Xamarin.Forms.Application.Current.MainPage; 

     if (mainPage is MyCustomContentPage || 
      (mainPage is NavigationPage && ((NavigationPage)mainPage).CurrentPage is MyCustomContentPage) || 
      (mainPage.Navigation != null && mainPage.Navigation.ModalStack.LastOrDefault() is MyCustomContentPage)) 
     { 
      return UIInterfaceOrientationMask.Landscape; 
     } 

     return UIInterfaceOrientationMask.Portrait; 
    } 
} 
+0

Jede Chance ein Beispiel? (Android wird es tun.) – KidCode

+0

Sicher Sache. Ich habe meine Antwort bearbeitet. Im Beispiel wird der Querformatmodus aktiviert, Sie können ihn jedoch ändern, um ihn Ihren Anforderungen anzupassen. – Dealdiane

+0

Ich habe die iOS-Version implementiert, aber es dreht sich nicht automatisch ... ist das möglich? – GBreen12

0

Dealdiane Code funktioniert gut für mich mit geringfügiger Änderung:

protected override void OnWindowVisibilityChanged(ViewStates visibility) { 
    base.OnWindowVisibilityChanged(visibility); 

    IRotationLock page = Element as IRotationLock; 
    if (page == null) 
     return; 

    var activity = (Activity) Context; 

    if (visibility == ViewStates.Gone) { 
     // Revert to previous orientation 
     activity.RequestedOrientation = _previousOrientation; 
    } else if (visibility == ViewStates.Visible) { 
     if (_previousOrientation == ScreenOrientation.Unspecified) { 
      _previousOrientation = activity.RequestedOrientation; 
     } 

     switch (page.AllowRotation()) { 
      case RotationLock.Landscape: 
       activity.RequestedOrientation = ScreenOrientation.SensorLandscape; 
       break; 
      case RotationLock.Portrait: 
       activity.RequestedOrientation = ScreenOrientation.SensorPortrait; 
       break; 
     } 
    } 
} 
1

Dies kann auch durch Senden der Nachricht von Formular-Projekt erfolgen MessagingCenter Klasse Host-Projekt mit.ohne den benutzerdefinierten Renderer oder Abhängigkeitsdienst wie folgt verwendet wird,

public partial class ThirdPage : ContentPage 
    { 
     protected override void OnAppearing() 
     { 
      base.OnAppearing(); 
     MessagingCenter.Send(this, "allowLandScapePortrait"); 
     } 
     //during page close setting back to portrait 
     protected override void OnDisappearing() 
     { 
      base.OnDisappearing(); 
      MessagingCenter.Send(this, "preventLandScape"); 
     } 
    } 

Änderung mainactivity die Nachricht und setzen RequestedOrientation

[Activity(Label = "Main", ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation,ScreenOrientation = ScreenOrientation.Portrait)] 
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity 
    {   
    //allowing the device to change the screen orientation based on the rotation 
    MessagingCenter.Subscribe<ThirdPage>(this, "allowLandScapePortrait", sender => 
    { 
    RequestedOrientation = ScreenOrientation.Unspecified; 
    }); 
//during page close setting back to portrait 
MessagingCenter.Subscribe<ThirdPage>(this, "preventLandScape", sender => 
    { 
    RequestedOrientation = ScreenOrientation.Portrait; 
    }); 
} 

prüfen mehr in meinem Blog-Post zu erhalten: http://www.appliedcodelog.com/2017/05/force-landscape-or-portrait-for-single.html

Verwandte Themen