2015-08-22 27 views
6

Çapraz platform uygulaması oluşturmak için Xamarin.Forms kullanıyorum, tüm ContentPages tüm PCL içinde bulunmaktadır.Xamarin.Forms içinde ContentPage yönelimi nasıl ayarlanır

Tek bir ContentPage ürününün'u Landscape'a ayarlamak ve kilitlemek için, özellikle de platforma özel projelerin her birinde başka bir aktivite oluşturmak zorunda kalmadan bir yol arıyorum. Benim ContentPage.Content yana

bir ScrollView ayarlanırsa, ben ScrollOrientationHorizontal için, ancak bu işe yaramadı ayarı denedim.

Ayrıca bir RelativeLayout kullanmayı denedim, ancak bu konuda bir Orientation özelliği göremiyorum.

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

Bana sunulan farklı Layouts'tur bakmaya Xamarin Studio'nun Intellisense sürümünü ve Xamarin Forms API Doc's kullanıyordu çalıştı son şey, bunların hiçbiri bir Orientation özelliğini vardı.

Bunu yapmanın tek yolunun, yalnızcanumaralı özel bir platform oluşturması ve yalnızca yönlendirmenin yatay olarak ayarlanmasıdır.

Bu yöntem işe yarayacak olsa da, ekranlar arasındaki Gezinti'yi çok daha karmaşık hale getirir.

Bu, şu anda Android'de test ediliyor.

cevap

12

bu demek istemem ama bu sadece custom renderers veya android bir platforma özgü kod

, sen ScreenOrientation.Landscape için MainActivity arasında RequestedOrientation özelliğini ayarlayabilirsiniz kullanılarak yapılabilir. Xamarin.Forms.Application.Current.MainPage İçinde intereted ContentPage olduğunda iOS ise

, sen UIInterfaceOrientationMask değerlerinden birini döndürmek için AppDelegate sınıfında GetSupportedInterfaceOrientations geçersiz kılabilir.



Android'i
[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

olma şansı Bir örnek? (Android yapacak.) – KidCode

+0

Elbette. Cevabımı düzenledim. Örnek manzara modunu zorlayacak, ancak gereksinimlerinize uyacak şekilde değiştirebilirsiniz. – Dealdiane

+0

iOS sürümünü uyguladım ama otomatik olarak dönmüyor ... bu mümkün mü? – GBreen12

0

Dealdiane kod küçük değişiklik benim için iyi çalışıyor:

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

Bu aynı zamanda MessagingCenter sınıfını kullanarak projeyi barındıracak Formu projesinden mesajı göndererek yapılabilir.aşağıdaki gibi benim blog yayınında ayrıntılı için mesaj ve set 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; 
    }); 
} 

Kontrolü almak, MainActivity içinde

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"); 
     } 
    } 

Değiştir özel oluşturucu veya bağımlılık hizmetini kullanmadan: http://www.appliedcodelog.com/2017/05/force-landscape-or-portrait-for-single.html

İlgili konular