我正在使用Xamarin.Forms创建跨平台应用程序,我的所有ContentPages都位于PCL中.
我正在寻找一种方法来设置和锁定单个ContentPage到Landscape的方向,最好不必在每个特定于平台的项目中创建另一个活动.
由于我的ContentPage.Content设置为ScrollView,我尝试将ScrollOrientation设置为Horizontal,但是这不起作用.
我也尝试过使用RelativeLayout,但我在这上面看不到Orientation属性.
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; } }
我尝试的最后一件事是使用Xamarin Studio的Intellisense版本和Xamarin Forms API Doc’s来查看我可用的不同布局,其中没有一个具有Orientation属性.
我担心唯一的方法是为这个ContentPage创建第二个特定于平台的Activity,并将方向设置为landscape.
虽然这种方法可行,但它使屏幕之间的导航变得更加复杂.
目前正在Android中测试.
解决方法
讨厌这样说,但这只能使用
custom renderers或特定于平台的代码来完成
在android中,您可以将MainActivity的RequestedOrientation属性设置为ScreenOrientation.Landscape.
在iOS中,当Xamarin.Forms.Application.Current.MainPage是您所在的ContentPage时,您可以覆盖AppDelegate类中的GetSupportedInterfaceOrientations以返回其中一个UIInterfaceOrientationMask值.
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; } }