如何处理Xamarin表单中的屏幕旋转/方向?

如何处理Xamarin表单中的屏幕旋转/方向?,xamarin,cross-platform,screen-orientation,xamarin.forms,Xamarin,Cross Platform,Screen Orientation,Xamarin.forms,对于不同的视图和平台(Android、iOS、WinPhone),是否有一种(半)通用的方法来处理Xamarin表单中的旋转/方向 UI确实会旋转,这已经足够好了,尽管它会破坏我的布局(现在是绝对布局)。我想使用Stacklayout可以使它更灵活一些,但当布局更复杂时,会在其他地方遇到障碍 我是否可以使用相同的ViewModel显示纵向和横向的不同视图?(我正在使用基于XLABs的MVVM。) 我找到了可能的解决办法: 缺少iOS,我想知道它是否能很好地处理MVVM,虽然看起来不错,但我现在正

对于不同的视图和平台(Android、iOS、WinPhone),是否有一种(半)通用的方法来处理Xamarin表单中的旋转/方向

UI确实会旋转,这已经足够好了,尽管它会破坏我的布局(现在是绝对布局)。我想使用Stacklayout可以使它更灵活一些,但当布局更复杂时,会在其他地方遇到障碍

我是否可以使用相同的ViewModel显示纵向和横向的不同视图?(我正在使用基于XLABs的MVVM。)

我找到了可能的解决办法:

缺少iOS,我想知道它是否能很好地处理MVVM,虽然看起来不错,但我现在正在调查

听起来很有希望,但示例仅限于iOS,链接的GIT存储库根本没有文档,它只是说“Xamarin Helpers”


也可以通过编程方式创建视图。虽然在我的测试中,我并没有得到一个大小改变的事件(尽管我在不同的代码位置听了),当我旋转的时候,ios模拟器。(解决方案基于大小更改以检测旋转。)

如果您已经在使用XLabs,则可以使用IXFormsApp和属性“方向”以及事件处理程序“旋转”。您必须为每个平台添加本机观察者,并在其中设置IXFormsApp的“方向”,这将导致事件处理程序调用

例如,在iOS上:

    public override bool FinishedLaunching(UIApplication app, NSDictionary options)
    {
        var xapp = new XFormsAppiOS();
        xapp.Init(this);

        var resolverContainer = new SimpleContainer();
        resolverContainer.Register<IXFormsApp>(xapp);
        Resolver.SetResolver(resolverContainer.GetResolver());

        var a = new App();
        LoadApplication(a);

        UIDevice.Notifications.ObserveOrientationDidChange((s, e) =>
        {
            xapp.Orientation = ... // set orientation here
        });
public override bool FinishedLaunching(UIApplication应用程序、NSDictionary选项)
{
var xapp=new XFormsAppiOS();
xapp.Init(this);
var resolverContainer=新的SimpleContainer();
解析容器寄存器(xapp);
SetResolver(resolverContainer.GetResolver());
var a=新应用程序();
申请(a);
UIDevice.Notifications.ObserveOrientationIDChange((s,e)=>
{
xapp.Orientation=…//在此处设置方向
});
现在,您可以通过解析IXFORMSAP来监视方向更改:

        xapp = Resolver.Resolve<IXFormsApp>();
        if (xapp.Orientation == Orientation.Landscape) { ... } else { ... } 
        xapp.Rotation += (sender, args) =>
        {
            switch (args.Value)
            {
                case Orientation.LandscapeLeft:
                    break;
                default:
                    // etc.
                    break;
            }
        };
xapp=Resolver.Resolve();
if(xapp.Orientation==Orientation.scape){…}else{…}
xapp.Rotation+=(发送方,参数)=>
{
开关(参数值)
{
案例方向。景观左:
打破
违约:
//等等。
打破
}
};

至于布局,我认为RelativeLayout将是最方便的选择,因为您可以将方向放在约束的内部。旋转时,使布局自身刷新。

因此,基本上我需要通过设置每个平台的方向来手动触发旋转事件。感谢iOS示例!