Search code examples
c#xamlxamarinxamarin.forms

Xamarin.Forms dynamic layout depending on screen orientation or size


Did Xamarin.Forms already contain a control/layout which orders it's content depending on the screen orientation or size?

What I want: Two stacklayouts which are ordered horizontal, if the screen got enough space. When the Screen changes, so that the screen got not enough horizontal-space, the two stacklayouts should be ordered vertical.

I don't want to do it in code behind.

I search for an solution which only uses the xaml.


Solution

  • I guess you can't achieve this using ONLY XAML. Certainly, you will need some c# code. The XAML on Xamarin.Forms is designed to be responsive, and you often define the view properties in a relative mode (instead of absolute).

    You can see an example of the behavior you want at this topic where we can see a screen changing the orientation of the StackLayout according to the device orientation (you can use it as your guideline to write your own layout component)

    The screen on portrait mode: The screen on portrait mode

    The screen on landscape mode: The screen on landscape mode

    That is accomplished with the following XAML:

    <?xml version="1.0" encoding="UTF-8"?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="ResponsiveLayout.StackLayoutPageXaml"
    Title="Stack Photo Editor - XAML">
        <ContentPage.Content>
            <StackLayout Spacing="10" Padding="5" Orientation="Vertical"
            x:Name="outerStack"> <!-- can change orientation to make responsive -->
                <ScrollView>
                    <StackLayout Spacing="5" HorizontalOptions="FillAndExpand"
                        WidthRequest="1000">
                        <StackLayout Orientation="Horizontal">
                            <Label Text="Name: " WidthRequest="75"
                                HorizontalOptions="Start" />
                            <Entry Text="deer.jpg"
                                HorizontalOptions="FillAndExpand" />
                        </StackLayout>
                        <StackLayout Orientation="Horizontal">
                            <Label Text="Date: " WidthRequest="75"
                                HorizontalOptions="Start" />
                            <Entry Text="07/05/2015"
                                HorizontalOptions="FillAndExpand" />
                        </StackLayout>
                        <StackLayout Orientation="Horizontal">
                            <Label Text="Tags:" WidthRequest="75"
                                HorizontalOptions="Start" />
                            <Entry Text="deer, tiger"
                                HorizontalOptions="FillAndExpand" />
                        </StackLayout>
                        <StackLayout Orientation="Horizontal">
                            <Button Text="Save" HorizontalOptions="FillAndExpand" />
                        </StackLayout>
                    </StackLayout>
                </ScrollView>
                <Image  Source="deer.jpg" />
            </StackLayout>
        </ContentPage.Content>
    </ContentPage>
    

    Some C# is used to change the orientation of outerStack based on the orientation of the device:

    protected override void OnSizeAllocated (double width, double height){
        base.OnSizeAllocated (width, height);
        if (width != this.width || height != this.height) {
            this.width = width;
            this.height = height;
            if (width > height) {
                outerStack.Orientation = StackOrientation.Horizontal;
            } else {
                outerStack.Orientation = StackOrientation.Vertical;
            }
        }
    }
    

    I hope it help you.