Neste artigo sobre Orientation, vamos fazer com que a nossa aplicação utilize a funcionalidade de orientação de forma programada, desta forma devemos reposicionar os objetos da página da aplicação conforme a posição que o usuário escolher.

Vamos então fazer algumas alterações na página principal da nossa aplicação. Vamos acrescentar uma tag grid com suas definições dentro do grid principal, conforme definido na Listagem 1, e substituiremos a tag <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> que fica logo abaixo de pelo seu conteúdo e por último vamos alterar voltar a propriedade “SupportedOrientetion” para o valor padrão que é “Portrait” SupportedOrientations="Portrait" Orientation="Portrait".

Listagem 1: Código para substituição da tag Grid


<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="445"/>
            <ColumnDefinition Width="103*"/>
        </Grid.ColumnDefinitions>
        <TextBlock Height="30" HorizontalAlignment="Left" Margin="26,10,0,0" Name="textBlock1" Text="Nome" VerticalAlignment="Top" />
        <TextBox Height="72" HorizontalAlignment="Left" Margin="10,50,0,0" Name="textBox1" Text="" VerticalAlignment="Top" Width="435" />
        <TextBlock Height="30" HorizontalAlignment="Left" Margin="26,132,0,0" Name="textBlock2" Text="Endereço" VerticalAlignment="Top" />
        <TextBox Height="72" HorizontalAlignment="Left" Margin="10,172,0,0" Name="textBox2" Text="" VerticalAlignment="Top" Width="435" />
        <StackPanel x:Name="stkBotoes" Grid.Row="1" Width="194">
            <Button Content="Salvar" Height="86" Name="button1"  Width="160" Margin="5,50,0,0"/>
            <Button Content="Limpar" Height="86" Name="button2" Width="160" Margin="5,20,0,0"/>
        </StackPanel>
    </Grid>
</Grid>

Com essa substituição a nossa página deve ficar como a figura abaixo (Figura 1).

Layout da aplicação após a substituição do código em MainPage.xaml

Figura 1: Layout da aplicação após a substituição do código em MainPage.xaml

Se executarmos a nossa aplicação e mudarmos a posição do nosso simulador para a posição horizontal (paisagem), nada vai acontecer, então devemos implementar o código necessário.

Em mainPage.xaml, clique com o botão direito do mouse e no menu escolha a opção ViewCode ou pressione a tecla F7, será mostrado o o código da nossa aplicação. No construtor da classe o que está abaixo de ”InitializeComponent();“ vamos inserir uma linha de código que vai configurar a nossa página para o modo vertical (portrait) ou horizontal (landscape) conforme (Listagem 2).

Listagem 2: Alterando a configuração da página


public MainPage()
{
    InitializeComponent();
    this.SupportedOrientations = SupportedPageOrientation.PortraitOrLandscape;
}

Executando a nossa aplicação e rotacionando a página pelo emulador, veremos a página rotacionada mas sem acesso ao botão limpar (Figura 2), isso porque ainda não fizemos o tratamento da página.

Tela rotacionada sem tratamento

Figura 2: Tela rotacionada sem tratamento

Para fazer o tratamento, devemos usar o evento de página chamado OrientationChanged, que é disparado sempre que o usuário faz um movimento no dispositivo. Vamos acessar o mainPage.xaml e na última linha da tag >phone:PhoneApplicationPage< vamos acrescentar o evento OrientationChanged (Listagem 3).

Listagem 3: Acrescentado o evento OrientationChanged


<phone:PhoneApplicationPage 
    x:Class="Orientacao.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True" OrientationChanged="PhoneApplicationPage_OrientationChanged">
 

Porém acrescentar este evento não basta, temos que fazer o tratamento necessário no código, então vamos acessar o código pressionando F7 em mainPage.xaml; perceberemos que foi criado um método (PhoneApplicationPage_OrientationChanged) automaticamente, o qual usaremos para fazer as implementações para tratarmos o evento OrientatioChanged. Então dentro deste método devemos verificar em qual posição o aparelho se encontra, para que possamos fazer o tratamento de acordo com a posição vertical ou horizontal alterando os métodos SetRow e SetColumns da classe Grid . Faremos isso verificando o retorno do parâmetro “e” passado pelo evento, conforme o código abaixo (Listagem 4).

Listagem 4: Código do método que fará a alteração dos objetos


       private void PhoneApplicationPage_OrientationChanged(object sender, OrientationChangedEventArgs e)
       {
           if ((e.Orientation & PageOrientation.Portrait) == PageOrientation.Portrait)
           {
               Grid.SetColumn(stkBotoes, 0);
               Grid.SetRow(stkBotoes, 1);
           }
           else
           {
               Grid.SetColumn(stkBotoes, 1);
               Grid.SetRow(stkBotoes, 0);
           }

       }

Agora, ao executarmos a nossa aplicação, veremos que os botões ficaram alinhados à direita, eliminando a necessidade de usar scrolling. Isso é muito interessante, porque nos da flexibilidade de usar ou não o scroll de acordo com a nossa aplicação.

Até o próximo post.