Option #1 'Orientation States' - Portrait & Landscape. Use 'OrientationStates' inside visual state manager like so:
Inside .XAML File
<Grid x:Name="myGrid"
Margin="10,30,10,10">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="OrientationStates">
<!-- Row & Column Definitions of Grid - [2 Rows, 1 Col = Portrait] & [1 Row, 2 Cols = Landscape] -->
<VisualState x:Name="Portrait">
<VisualState.Setters>
<Setter Property="Grid.RowDefinitions"
Value="*,*" />
<Setter Property="Grid.ColumnDefinitions"
Value="*" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Landscape">
<VisualState.Setters>
<Setter Property="Grid.RowDefinitions"
Value="*" />
<Setter Property="Grid.ColumnDefinitions"
Value="*,*" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<!-- Change position of stack layouts in grid, to match above stated orientation requirement -->
<StackLayout x:Name="firstStackLayout">
<Entry Placeholder="Enter first words" />
<Button Text="Nothing Happens" />
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="Portrait">
<VisualState.Setters>
<Setter Property="Grid.Row" Value="0" />
<Setter Property="Grid.Column" Value="0" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Landscape">
<VisualState.Setters>
<Setter Property="Grid.Row" Value="0" />
<Setter Property="Grid.Column" Value="0" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</StackLayout>
<StackLayout x:Name="secondStackLayout">
<Entry Placeholder="Enter last words" />
<Button Text="Still Nothing Happens" />
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="Portrait">
<VisualState.Setters>
<Setter Property="Grid.Row" Value="1" />
<Setter Property="Grid.Column" Value="0" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Landscape">
<VisualState.Setters>
<Setter Property="Grid.Row" Value="0" />
<Setter Property="Grid.Column" Value="1" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</StackLayout>
</Grid>
With an added 'OnSizeAllocated()' function in CodeBehind like so:
Inside .XAML.CS File
public partial class RegisterPage : ContentPage
{
public RegisterPage()
{
InitializeComponent();
}
protected override void OnSizeAllocated(double width, double height)
{
base.OnSizeAllocated(width, height);
var state = (width > height) ? "Landscape" : "Portrait";
// Call the 'Portrait' & 'Landscape' States in .XAML File
VisualStateManager.GoToState(myGrid, state);
VisualStateManager.GoToState(firstStackLayout, state);
VisualStateManager.GoToState(secondStackLayout, state);
}
}
[OR]
Option #2 The magic bullet - Your ONLY .XAML File solution to that problem.
'Orientation Triggers' - Portrait & Landscape.
Use 'OrientationStateTriggers' inside 'State Triggers' in Visual State like so:
Inside .XAML File
<Grid Margin="10,30,10,10">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<!-- Row & Column Definitions of Grid - [2 Rows, 1 Col = Portrait] & [1 Row, 2 Cols = Landscape] -->
<VisualState x:Name="gridPortrait">
<VisualState.StateTriggers>
<OrientationStateTrigger Orientation="Portrait" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="Grid.RowDefinitions"
Value="*,*" />
<Setter Property="Grid.ColumnDefinitions" Value="*" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="gridLandscape">
<VisualState.StateTriggers>
<OrientationStateTrigger Orientation="Landscape" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="Grid.RowDefinitions"
Value="*" />
<Setter Property="Grid.ColumnDefinitions"
Value="*,*" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<!-- Change position of stack layouts in grid, to match above stated orientation requirement -->
<StackLayout>
<Entry Placeholder="Enter first words" />
<Button Text="Nothing Happens" />
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="myPortraitState">
<VisualState.StateTriggers>
<OrientationStateTrigger Orientation="Portrait" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="Grid.Row" Value="0" />
<Setter Property="Grid.Column" Value="0" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="myLandscapeState">
<VisualState.StateTriggers>
<OrientationStateTrigger Orientation="Landscape" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="Grid.Row" Value="0" />
<Setter Property="Grid.Column" Value="0" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</StackLayout>
<StackLayout>
<Entry Placeholder="Enter last words" />
<Button Text="Still Nothing Happens" />
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="myPortraitState">
<VisualState.StateTriggers>
<OrientationStateTrigger Orientation="Portrait" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="Grid.Row" Value="1" />
<Setter Property="Grid.Column" Value="0" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="myLandscapeState">
<VisualState.StateTriggers>
<OrientationStateTrigger Orientation="Landscape" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="Grid.Row" Value="0" />
<Setter Property="Grid.Column" Value="1" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</StackLayout>
</Grid>