Olá a todos, hoje iniciamos uma série de artigos para mostrar as novidades no desenvolvimento para Windows Phone 7. O foco desse conjunto de textos será apresentar o que mudou nas tools, o que o desenvolvedor pode esperar de novo utilizando a versão 7.1 do ferramental de desenvolvimento. De qualquer forma, sei que muitos estão iniciando o desenvolvimento agora, especialmente por conta do lançamento no Brasil, então iremos mostrar todo o processo de download, onde cada ferramenta se enquadra, e aí partiremos para novidades bacanas, como novas formas de utilização da câmera, localização no emulador, novos tiles, SQL CE, entre outros artigos. Para quem está familiarizado com o desenvolvimento, espero poder acrescentar com as novidades. Para quem é novo, não se preocupe, pois o foco é nivelar todos para que possamos ter cada vez mais adeptos do desenvolvimento para a belíssima plataforma que é o WP7!

Mãos a obra!

 

FAZENDO O DOWNLOAD DAS FERRAMENTAS

O desenvolvimento para o Mango continua funcionando da mesma forma. Ou seja, é muito fácil começar a desenvolver, tudo que você precisa é ir ao APP HUB ( http://create.msdn.com ) e fazer um download único. Esse download irá deixar sua máquina 100% pronta mesmo que estejamos falando de uma máquina nova (é importante frisar, para quem já está trabalhando com desenvolvimento para WP7, que a Microsoft recomenda a instalação das tools 7.1 Beta em uma máquina diferente da que possui a instalação atual).

1

Figura 1 . Fazendo o download no site APP HUB


4

Figura 2 . A instalação é feita via download único.

 

Após o download, será instalado na sua máquina:

1-Visual Studio 2010 Express For Windows Phone

A IDE de desenvolvimento para Windows é e continua sendo a já famosa IDE da Microsoft. Para o Mango, a versão do Visual Studio continua sendo a mesma e o melhor de tudo, 100% gratuita. Não se enganem com o “Express” do nome, qualquer aplicação que possa fazer em versões mais completas pode ser criada aqui. Aliás, sempre importante lembrar, mas caso você já tenha uma versão do Visual Studio mais completa instalada, os templates para desenvolvimento do WP7 serão adicionados a sua IDE.

2-Expression Blend 4 For Windows Phone

A melhor companhia para o Visual Studio na hora de criar visuais ricos e animações. O Expression Blend permite importação e exportação de projetos do Visual Studio, tornando fácil para criar um design rico e facilitado pelas ferramentas presentes no Expression Blend, e depois migrar o projeto para o Visual Studio e escrever a aplicação propriamente dita. Esse processo pode ser usado inúmeras vezes, de acordo com a necessidade.

3-O emulador

O emulador torna fácil e barato o desenvolvimento de aplicações para Windows Phone 7. Não há a necessidade de que você tenha um aparelho (apesar de ser aconselhável) para desenvolver sua aplicação. O emulador do Mango vem com diversas novas funcionalidades para testar acelerômetro, localização, entre outras novidades.

4-XNA Game Studio e Silverlight for Windows Phone

O framework para criar jogos e o Silverlight for Windows Phone (que agora na versão Mango é baseado no Silverlight 4) também já são instalados. Aqui temos inúmeras situações novas e bacanas, que vamos detalhar mais nos próximos artigos.

Após o download finalizado, você pode clicar no Visual Studio para verificar os projetos de Windows Phone que podem ser criados. Na inicialização da IDE você verá que pode utilizar C# ou VB.NET (os templates para trabalhar com ambas as linguagens estão disponíveis) e para quem já vinha trabalhando com WP7, temos alguns novos templates que detalhamos a seguir.

9
Figura 3 . O Novo Visual Studio Express For Windows Phone

 

11

Figura 4 . Ao criar novo projeto, agora escolhemos qual a versão da plataforma

 

10

Figura 5 . O novo conjunto de templates Silverlight for Windows Phone

 

Os templates para desenvolvimento são:

Windows Phone Application (também disponível anteriormente): Um template que criará uma aplicação em branco, apenas com o xaml inicial e sem nenhum controle embutido. Ideal para começar a aplicação do zero e ter liberdade de escolha.

Windows Phone Databound Application (também disponível anteriormente): Nesse template já temos um Listbox e uma página de detalhes sendo acionada por evento do controle da página principal, ou seja, uma solução que facilita um pouco o desenvolvimento de uma aplicação que conterá uma lista de dados e detalhamento de cada um.

Windows Phone Class Library (também disponível anteriormente): Uma biblioteca de classes, que irá compilar como uma DLL que pode ser redistribuída pelo desenvolvedor.

Windows Phone Panorama Application (também disponível anteriormente): O panorama Application já montará o projeto utilizando o controle Panorama e também montará a base para que seu projeto use o pattern MVVM.

Windows Phone Pivot Application (também disponível anteriormente): O Pivot Application funciona da mesma forma que o Panorama, apenas utilizando o Pivot ao invés do controle Panorama.

Windows Phone 3D Graphics application (NOVIDADE!!!!!!!!): Esse template permitirá a incorporação de conteúdo Silverlight e XNA na mesma aplicação (há um novo template de projeto XNA com a mesma finalidade, mas não é o escopo dos artigos). Esse template criará uma página que suportará renderização de conteúdo XNA. Iremos falar mais sobre o template em breve aqui no blog.

Windows Phone Audio Playback Agent (NOVIDADE!!!!!!!): Novo template que na verdade funciona como uma biblioteca de classes, mas habilitado para poder tocar arquivos de áudio (permitido a partir do Mango para aplicações desenvolvidas por nós!) usando o novo conceito de “agentes” (Background Agents). Falaremos muito ainda sobre Background Agents, já que é uma solução muito interessante, viabiliza o multitask e que ainda assim trabalha de uma forma a economizar bateria. O projeto gerará uma DLL que pode ser posteriormente referenciada.

Windows Phone Audio Streaming Agent (NOVIDADE!!!!!!): Novo template que funciona como o Phone Audio Playback, mas com o intuito de suportar streaming de áudio. Gera uma DLL na compilação e também utiliza o conceito de Background Agent.

Windows Phone Task Scheduler Agent (NOVIDADE!!!!!!!!): Assim como os dois anteriores, também uma biblioteca de classes , porém nesse caso utiliza o conceito de Background Agent para fazer alguma tarefa de background. Imagine que sua app precisa atualizar a cada 30 minutos, é aqui que o trabalho será feito. Sim, é aqui que a magia do multitask vai se tornar real no WP7. Mas não se engane em achar que isso é como um serviço de background do Windows e que a Microsoft está voltando aos tempos de Windows Mobile, as regras são rígidas para uso dos agentes, quantidade de vezes que rodará e quanto tempo sua atualização pode ficar rodando esse agente.

Antes de concluirmos, gostaria apenas de comentar um pouco mais sobre as novidades que o emulador sofreu. Além de termos como usar alguns dos novos recursos do Mango (Bing Voice, por exemplo, está lá), o emulador agora conta com algo chamado “Additional Tools”, que são ferramentas para que possamos utilizar Localização e/ou acelerômetro, por exemplo. Então aquela sua aplicação que mexia algo na tela através do acelerômetro , ou mesmo aquela utilização do Bing Maps pegando sua localização atual e que era complicadíssimo para testar, tendo que adicionar código de teste, agora é simples com o novo emulador!

image_41F000D4

Figura 6 . Additional Tools, novidade no emulador

 

Bom, espero que com isso possamos ter uma visão do que vem por aí no Mango. A partir daqui vou começar a fazer diversos artigos curtos mostrando as novidades uma a uma, os novos templates, ajudando assim quem está começando agora e também melhorando o conhecimento de quem já está com o WP7 desde o 7.0.

Posso afirmar, mesmo com o pouco tempo de Mango Tools na mão, que temos MUITAS novidades e que o WP7 está vindo com tudo. A atualização é gigantesca e tem muita coisa nova em cima de uma plataforma que já era bem bacana!

Vale a pena estudar e dedicar-se, o Windows Phone 7 veio para ficar!!

A renderização da interface gráfica do Windows Phone 7 foi projetada para buscar o máximo de performance que o smartphone pode proporcionar, a UI Thread é responsável pelo desenho da interface principal do aplicativo, quando criamos um software para o WP7, devemos evitar bloquear a UI Thread, pois ela está diretamente relacionada a performance do software e também com a experiência do usuário com o aplicativo.

Os smartphones com Windows Phone 7, tem disponível um recurso que utiliza a aceleração da GPU, aumentando consideravelmente o desempenho gráfico para algumas tarefas relacionadas a manipulação de imagens e animações, principalmente as que usam a rotação de eixos, escalas e alguns tipos de  animações que usam de Storyboard. Não é necessário acionar nada para que alguns tipos de Storyboards utilizem esse recurso, eles automaticamente usam o Composition Thread ou também chamado de Render Thread.

O Render Thread pode ser usado para animações simples utilizando DoubleAnimation ou Easing Functions, ou em propriedades  como Opacity, Render Transforms e Rectangular Clip. Habilitando o EnableRedrawRegions podemos ver quais regiões na aplicação estão sendo desenhadas no momento, visualizando  quadro a quadro:

Application.Current.Host.Settings.EnableRedrawRegions = true;

Composition Frame Rate Thread  e UI Frame Rate Thread

 

Quando executamos um aplicativo através do Visual Studio 2010 com o smartphone plugado no computador,  podemos visualizar alguns números no lado superior direito da tela, esses números servem para você ter como parâmetro alguns pontos sobre a renderização gráfica, memória, etc, os dois primeiros números de 3 dígitos são referente a Render Thread e a UI Thread.

O Composition Frame Rate Thread está associado a velocidade com que a tela é atualizada em uma thread separada da UI Thread, como referência, o Windows Phone 7 utiliza o valor 30 como ponto de equilíbrio, ou seja, quando for abaixo de 30, os números estarão na cor vermelha, acima de 30 ele ficará com a cor default, o valor mais próximo de uma boa performance é 60, sua aplicação deve buscar sempre se aproximar desse número.

O UI Frame Rate Thread mostra a taxa de atualização da Thread principal, enquanto a interface do usuário estiver ativa, o valor de 30 também foi definido como ponto de equilíbrio, ficando vermelho se a aplicação estiver abaixo deste valor, porém este valor deve ser acima de 20 para ter um tempo de resposta aceitável e quanto maior o valor , o tempo de resposta será mais rápido.

Exemplo prático de UI Thread VS Render Thread

Vou criar um aplicativo simples com dois elementos Ellipse na tela, um com o nome BolaVermelha e outro com BolaAzul, as duas Ellipses serão animadas na tela, a BolaAzul vai utilizar o Render Thread, pois vamos utilizar uma Storyboard com a propriedade RenderTransform, já a BolaVermelha vamos anima-lá atualizando a mesma propriedade, mas utilizando um timer DispatcherTimer para atualizar a propriedade, ou seja, não utilizaremos uma Storyboard para realizar a animação e ela estará utilizando a UI Thread.

public partial class MainPage : PhoneApplicationPage
{
    DispatcherTimer timer;
    RotateTransform rotateVermelho;

    bool bateVolta;
    int contador = 0;

    public MainPage()
    {
        InitializeComponent();

        Loaded += new RoutedEventHandler(MainPage_Loaded);
        Application.Current.Host.Settings.EnableRedrawRegions = true;
        this.BolaVermelha.RenderTransform = new RotateTransform();
        this.BolaAzul.RenderTransform = new RotateTransform();

        rotateVermelho = BolaVermelha.RenderTransform as RotateTransform;
        rotateVermelho.Angle = -50;

        timer = new DispatcherTimer();
        timer.Tick += new EventHandler(timer_Tick);
        timer.Interval = new TimeSpan(0, 0, 0, 0, 33);
        timer.Start();

        bateVolta = false;
    }

    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        Storyboard storyboard = new Storyboard();
        DoubleAnimation animation = new DoubleAnimation();

        animation.From = 0;
        animation.To = 180;
        animation.Duration = new Duration(new TimeSpan(0, 0, 1));
        animation.AutoReverse = true;

        Storyboard.SetTarget(animation, this.BolaAzul.RenderTransform);
        Storyboard.SetTargetProperty(animation, new PropertyPath("Angle"));

        storyboard.Children.Add(animation);
        storyboard.RepeatBehavior = RepeatBehavior.Forever;
        storyboard.Begin();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        if (rotateVermelho.Angle == 120)
        {
            bateVolta = true;
        }

        if (rotateVermelho.Angle == -50)
        {
            bateVolta = false;
        }

        if (bateVolta == true)
        {
            rotateVermelho.Angle -= 1;
        }
        else
        {
            rotateVermelho.Angle += 1;
        }

        contador++;

        if (contador == 600)
        {
            MessageBox.Show("Parando a UI Thread");
            Thread.Sleep(1000);
        }

        if (contador == 1000)
        {
            MessageBox.Show("Inserindo BitmapCache");
            BitmapCache cache = new BitmapCache();
            BolaVermelha.CacheMode = cache;
        }
    }
}

Na linha 68 criei um contador, quando chegar a 600, ele vai bloquear a UI Thread, na linha 73, a UI Thread é bloqueada propositalmente utilizando Thread.Sleep, neste momento você irá notar que a animação da  BolaVermelha irá parar com base no tempo definido em Sleep, pois a sua Thread está bloqueada, mas a BolaAzul continuará a se movimentar.

Quando o contador chegar a 1000,  vou adicionar um BitmapCache na propriedade CacheMode da BolaVermelha, em alguns casos onde não estamos utilizando a Render Thread, podemos criar um cache, ou seja, colocar os bitmaps na memória, e com isso aproveitar da aceleração da GPU, com performance semelhante a Composition Thread, porém a BolaVermelha continuará na UI Thread,  uma simples mensagem na tela utilizando um MessageBox irá bloquear a UI Thread enquanto a BolaAzul continuará em movimento.

Conclusão

UI Thread e Composition Thread são recursos fundamentais que o Windows Phone 7 utiliza para apresentar a interface gráfica, conhecendo essas Threads você poderá melhorar a perfomance da sua aplicação, os smartphones são equipamentos limitados se comparado a um PC, conhecer quando utilizar determinado recurso pode fazer muita diferença, existem diversos outros pontos a serem considerados quanto ao monitoramento da aplicação com objetivo de melhorar a perfomance, neste artigo somente apresentei uma introdução sobre o assunto.

Alguns recursos podem não funcionar como esperado no emulador, pois depende de diversos fatores como o suporte a DirectX pela placa de video, neste link você encontra mais informações:

WP7/Silverlight Graphics Performance

Mais informações sobre Bitmap Cache : Bitmap Cache

Mais informações sobre performance: Performance Considerations in Applications for Windows Phone 

 

Categorias: artigos
Tags:

Há alguns dias atrás acompanhei algumas notícias e posts sobre uma nova atualização para o Windows Phone 7. Na noite de hoje recebi a notificação em meu HTC HD7 que uma nova atualização estava disponível.

Segundo informações oficiais a atualização é para corrigir uma vulnerabilidade de segurança envolvendo 9 certificados não confiáveis. A ação tomada pela Microsoft foi mover estes certificados para os “Certificados Não Confiáveis” no armazenamento do Windows Phone. Vale destacar que essa não era uma vulnerabilidade causada pela Microsoft.

Seguem algumas imagens do processo de atualização:

image image
image image

Maiores informações podem ser obtidas em:

Windows Phone update history
Latest update news

Até a próxima…

Categorias: notícias
Tags:

Introdução
Nos artigos “Globalização e Localização no Windows Phone - Parte 1” e “Globalização e Localização no Windows Phone - Parte 2” falamos sobre a parte teórica de globalização e localização. A partir de agora iremos ver as particularidades da implementação desses recursos em nossa aplicações.

Conhecendo o System.Globalization
Quando falamos de aplicações globalizadas, um dos pontos principais que temos que trabalhar é o namespace System.Globalization, pois nele existem as classes responsáveis por definir todas as informações relacionadas à cultura, incluindo linguagem, país/região, calendário e etc.

Dentro deste namespace, temos a classe CultureInfo responsável por fornecer informações de uma cultura específica e consequentemente é a classe que utilizaremos para criar nossa aplicação globalizada.

Criando a aplicação
A aplicação que iremos criar é extremamente simples, mas com ela já é possível começarmos a entender o funcionamento e comportamento de aplicações globalizadas.

A ideia é oferecermos para o usuário uma lista contendo as culturas disponíveis para que ele possa selecionar a mais adequada, e baseado nesta seleção exibiremos a data atual e um valor monetário devidamente formatado de acordo com a seleção. Para isso, faça o seguinte:

  • Crie um projeto do tipo Windows Phone Application;
  • Abra o arquivo MainPage.xaml;
  • Adicione ao seu ContentPanel, os seguintes controles:        
    <!--ContentPanel - place additional content here-->
    <StackPanel Height="824" HorizontalAlignment="Left" Margin="9,6,0,0" Name="stackPanel2" VerticalAlignment="Top" Width="443" Background="{StaticResource PhoneBackgroundBrush}">
    
        <TextBlock Height="30" Name="textBlock1" Text="Selecione uma localização" Width="443" Foreground="{StaticResource PhoneAccentBrush}" />
    
        <ListBox Height="250" HorizontalAlignment="Left" Margin="9,6,0,10" Name="locList" VerticalAlignment="Top" Width="441" SelectedIndex="-1" SelectionChanged="LocList_SelectedIndexChanged">
            <ListBoxItem Content="French, France" FontSize="22" />
            <ListBoxItem Content="German, Germany" FontSize="22" />
            <ListBoxItem Content="Italian, Spain" FontSize="22" />
            <ListBoxItem Content="Spanish, Spain" FontSize="22" />
            <ListBoxItem Content="English, United Kingdom" FontSize="22" />
            <ListBoxItem Content="English, United States" FontSize="22"/>
            <ListBoxItem Content="Danish, Denmark" FontSize="22" />
            <ListBoxItem Content="Portuguese, Brazil" FontSize="22" />
        </ListBox>
    
        <TextBlock Height="30" Name="textBlock4" Text="Data" Width="443" Foreground="{StaticResource PhoneAccentBrush}"/>
        <TextBlock Height="30" Name="txbData" Text=" " Width="443" />
    
        <TextBlock Height="30" Name="textBlock7" Text="Monetário" Foreground="{StaticResource PhoneAccentBrush}"/>
        <TextBlock Height="30" Name="txbMonetario" Text=" " Width="443" />
    </StackPanel>

Com o layout devidamente definido, podemos adicionar os códigos necessários.

  • Abra o arquivo MainPage.xaml.cs;
  • Adicione o tratamento do evento SelectedIndexChanged do listbox LocList, que será responsável por definir a nova cultura que será utilizada e exibir as informações formatadas:     
    private void LocList_SelectedIndexChanged(object sender, SelectionChangedEventArgs e)
    {
        string culture;
        switch (locList.SelectedIndex.ToString())
        {
    
            case "0":
                culture = "fr-FR";
                break;
            case "1":
                culture = "de-DE";
                break;
            case "2":
                culture = "it-IT";
                break;
            case "3":
                culture = "es-ES";
                break;
            case "4":
                culture = "en-GB";
                break;
            case "5":
                culture = "en-US";
                break;
            case "6":
                culture = "da-DK";
                break;
            case "7":
                culture = "pt-BR";
                break;
            default:
                culture = "en-US";
                break;
        }
    
        Thread.CurrentThread.CurrentCulture = new CultureInfo(culture);
    
        txbData.Text = DateTime.Now.ToString();
    
        double valor = 954371.52;
        txbMonetario.Text = valor.ToString("C");
    }
  • Compile e teste seu código;

Conclusão
Como pudemos perceber, o segredo inicial da globalização de uma aplicação está na utilização da classe CultureInfo, de acordo com a cultura desejada. Na próxima parte de nossa série de artigos, mostraremos como efetuar a localização de nossa aplicação. Até a próxima…

Categorias: artigos
Tags: ,

Introdução
No artigo “Globalização e Localização no Windows Phone - Parte 1” demos uma rápida introdução sobre Globalização e Localização, no entanto antes de colocarmos a mão na massa é bom entendermos e conhecermos quais as melhores práticas para essa implementação.

Melhores Práticas

  • Separe código dos seus recursos (resources)
    • Recursos, basicamente são textos, imagens e/ou vídeos que utilizamos em nossas aplicações. O idéia é que sejam criados arquivos de recursos, deixando totalmente separado do código
  • Localize textos e não tags
    • Realize a localização apenas dos textos, jamais das tags. Por exemplo:
      • Não localizar: <link>leia mais</link>
      • Localizar: leia mais
  • Adeque o espaço necessário
    • Durante o processo de localização de textos é extremamente importante lembrarmos que a mesma informação em Português, Inglês, ou Alemão possivelmente terão quantidade de caracteres diferentes e ocuparão um espaço diferente. Sendo assim, é necessário adequar o espaço existente para a correta exibição.
  • Localize sentenças ao invés de palavras
    • Um erro comum é criar arquivos de recursos realizando localização de palavras individualmente, ao invés de sentenças completas. Isso não deve ser realizado, pois a combinação de palavras isoladas, provavelmente formaram sentenças incorretas na maioria dos idiomas.
  • Cuidado com a ordem das informações
    • Devemos sempre lembrar que no processo de localização precisamos respeitar os formatos da cultura, sendo assim textos parametrizados devem tomar o cuidade de exibí-los corretamente, como por exemplo a exibição de datas, monetários e etc.
  • Reutilização de textos/palavras
    • Cuidado ao tentar reutilizar textos/palavras que possam ter significados diferentes de acordo com o contexto utilizado. Neste caso prefira criar localizações diferentes para cada eventual significado.
  • Utilize identificadores únicos para os recursos
    • Ao criar sua lista de recursos, garanta que sempre existirá um identificador único, dessa maneira sempre que precisar utilizá-lo, fará referência a este identificador, garantindo que sempre consiga encontrar a informação necessária.

Conclusão
Seguindo esta pequena lista de melhores práticas garantimos que nossa aplicação poderá ser globalizada sem maiores problemas. Na próxima parte de nossa série de artigos, começaremos a explorar como implementar o processo de globalização e localização de nossas aplicações. Até a próxima…

Categorias: artigos
Tags: ,