segunda-feira, 7 de maio de 2012

Primeira Aplicação para o Windows Phone

Neste artigo fazemos uma primeira abordagem ao desenvolvimento de aplicações para Windows Phone.

Para começar, precisamos de instalar o Windows Phone SDK 7.1, o qual vem com um IDE gratuito (Visual Studio Express) e um emulador de Windows Phone, o qual nos permite testar as nossas aplicações antes de as instalar num dispositivo móvel baseado em Windows Phone.

Neste exemplo foi usado o Visual Studio 2010 para o desenvolvimento, mas, claro, o Windows Phone SDK 7.1 precisa na mesma de ser instalado.

Modelo de Execução do Windows Phone

Antes de começar o desenvolvimento da nossa primeira app, apenas algumas palavras sobre o modelo de execução do Windows Phone:
  • Apenas uma App pode correr num dado momento em foreground;
  • Outras Apps em execução são colocadas pelo sistema operativo (SO) num estado dormente (dormant state);
  • Quando a memória do dispositivo não é suficiente, o SO começa a terminar aplicações que estejam no estado dormente.
  • Através da sua framework de programação, as aplicações podem gerir o seu estado quando são ativadas ou desativadas. Isto pode ser usado para dar ao utilizador a impressão de que uma aplicação esteve sempre a correr, mesmo quando ela é parada e mais tarde reativada.

Criar um novo Projeto Windows Phone

No Visual Studio (ou Visual Studio Express), criar um novo projeto com o template para "Silverlight for Windows Phone", a tipo Windows Phone Application:






 Depois, selecionar a versão do Sistema Operativo:




O Visual studio cria a arquitetura da aplicação, de apenas uma página:


As aplicações Windows Phone são feitas de descrições de páginas da User Interface (UI) usando Silverlight (Silverlight é um subconjunto do XAML, a linguagem baseada em XML para descrição de UIs, criada pela Microsoft), e ficheiros de code behind em C# (embora também possa ser usado VB.Net).

No centro da imagem acima, podemos ver duas vistas do ficheiro MainPage.XAML, que é a descrição da UI da nossa aplicação. As duas vistas são, à esquerda, uma vista gráfica da página e, à direita, a descrição XAML. Pode-se modificar qualquer uma das duas vistas, sendo as modificações automaticamente refletidas na outra vista.

Através de drag and drop de controlos a partir da toolbox, para a vista gráfica da página XAML, podemos compor a UI da nossa aplicação:



Vamos fazer uma app para converter graus Farenheith em graus Celsius, pelo que arrastamos uns TextBlocks, uma TextBox e um Button:



 O XAML equivalente é:

<phone:PhoneApplicationPage
    x:Class="MinhaPhoneApp.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="PortraitOrLandscape"  Orientation="Portrait"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel contains the name of the application and page title-->
        <StackPanel Orientation="Vertical" x:Name="TitlePanel" Margin="12,17,0,28" Grid.ColumnSpan="7">
            <TextBlock x:Name="ApplicationTitle" Text="Minha Phone App" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="PageTitle" Text="ºF --> ºC" TextAlignment="Center" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0">
            <TextBlock Height="50" HorizontalAlignment="Left" Margin="17,37,0,0" Name="textBlock1" Text="Temperatura ºF : " VerticalAlignment="Top" Style="{StaticResource PhoneTextLargeStyle}" />
            <TextBox Height="72" HorizontalAlignment="Left" Margin="236,25,0,0" Name="textBox1" Text="" VerticalAlignment="Top" Width="220" TextChanged="textBox1_TextChanged" />
            <Button Content="Converter temperatura" Height="72" HorizontalAlignment="Left" Margin="57,117,0,0" Name="button1" Click="button1_Click" VerticalAlignment="Top" Width="344" />
            <TextBlock Height="173" HorizontalAlignment="Left" Margin="57,209,0,0" Name="textBlock2" Text="TextBlock" VerticalAlignment="Top" Width="344" Style="{StaticResource PhoneTextTitle1Style}"/>
        </Grid>
    </Grid>

</phone:PhoneApplicationPage>



Note-se o código XAML para o botão:

<Button Content="Converter temperatura" Height="72" HorizontalAlignment="Left"
        Margin="57,117,0,0" Name="button1" Click="button1_Click"
        VerticalAlignment="Top" Width="344" />

O event handler que irá correr quando o botão é clicado é button1_Click.
Precisamos agora de fornecer o código para o event handler:





Aqui está o code behind completo para MainPage.XAML.cs:

using System.Windows.Shapes;
using Microsoft.Phone.Controls;

namespace MinhaPhoneApp
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }



        private void button1_Click(object sender, RoutedEventArgs e)
        {
            int fahrenheit = 0;

            if (Int32.TryParse(textBox1.Text, out fahrenheit))
            {

                // C = 5 * ((F-32)/9)

                decimal celsius = 5 * (((decimal)fahrenheit - 32) / 9);

                textBlock2.TextAlignment = TextAlignment.Center;
                textBlock2.Text = Decimal.Round(celsius, 0).ToString() + "º C";
            }
            else
            {
                textBlock2.Text = "Dados inválidos!!!";
            }
        }

        private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
        {

        }

    }
}


Depois, podemos testar a nossa App usando o emulador de dispositivo Windows Phone:




Sem comentários:

Enviar um comentário