Silverlight 5

Depois de meses com rumores (infundados) de que a Microsoft ia largar o Silverlight em prole do HTML5, heis que é chegado finalmente o dia de lançamento oficial do Silverlight 5!

As novidades são muitas, mas estas são as que mais se destacam:

Podem encontrar na página oficial do Silverlight uma série de vídeos introdutórios com Pete Brown, Developer Division Community Program Manager na Microsoft.

@Silverlight SDK

Silverlight for Windows Phone Toolkit – Nov 2011

Já se encontra disponível a versão de Novembro do Silverlight for Windows Phone Toolkit!

A lista completa de novidades e correcções é relativamente extensa, e está disponível num artigo do Jeff Wilcox (Senior Software Developer na Silverlight Phone & Devices team).

Como de costume, o toolkit está disponível para download directo do MSI, package através do NuGet, e código fonte no Codeplex!

Nota: pessoalmente já detectei alguns problemas com esta versão, nomeadamente uma situação com o ListPicker que remove todas as transições das páginas após ter sido aberto; este bug já foi aqui reportado, e pretendo brevemente disponibilizar um patch aqui no blog para este problema!

BitmapImage no Windows Phone “Mango”

Várias alterações foram feitas no Windows Phone “Mango” para melhorar a performance das aplicações, grande parte delas totalmente transparente para os programadores!

Uma delas tem a ver com o carregamento de imagens no BitmapImage: por omissão, todas as imagens são carregadas apenas quando necessárias, mas esse trabalho é feito no thread principal, causando o bloqueio (ou atraso!) da aplicação até que a imagem seja completamente carregada; ou seja, se a intenção era de fazer o carregamento das imagens num thread separado para não bloquear a interface, teriamos que implementar nós mesmos essa funcionalidade!

Neste momento, existe a possibilidade de deixar que o Silverlight no Windows Phone se encarregue de carregar as imagens assincronamente em threads separados do principal, recorrendo à propriedade BitmapImage.CreateOptions.

Esta propriedade do tipo BitmapCreateOptions tem o valor por omissão de DelayCreation, que tal como indicado anteriormente, carrega a imagem apenas quando esta for realmente necessária, mas no thread principal.

A título de exemplo, sabemos que este bloco de código:

<Image Source="http://domain/image.png" />

É equivalente a este:

<Image>
    <Image.Source>
        <BitmapImage CreateOptions="DelayCreation" UriSource="http://domain/image.png" />
    </Image.Source>
</Image>

Para forçar o carregamento assíncrono de imagens, devemos colocar neste propriedade o valor BackgroundCreation, em que o Silverlight se encarrega de criar e manter uma cache de imagens carregadas em background.

<Image>
    <Image.Source>
        <BitmapImage CreateOptions="BackgroundCreation" UriSource="http://domain/image.png" />
    </Image.Source>
</Image>

O ideal será mesmo colocar o valor das duas propriedades, “DelayCreation,BackgroundCreation” , forçando assim o Silverlight para carregar as imagens apenas quando forem necessárias, mas sempre num thread separado!

<Image>
    <Image.Source>
        <BitmapImage CreateOptions="DelayCreation,BackgroundCreation" UriSource="http://domain/image.png" />
    </Image.Source>
</Image>

Silverlight for Windows Phone Toolkit In Depth

O WindowsPhoneGeek.com tem sido uma das maiores fontes de informação para quem está ou pretende começar a desenvolver para o Windows Phone.

Recentemente, disponibilizou gratuitamente o e-Book “Silverlight for Windows Phone Toolkit In Depth“, escrito por Boryana Miloshevska, onde é apresentada a maior compilação de documentação sobre o Silverlight for Windows Phone Toolkit que já foi feita!

É sem dúvida um e-Book de referência essencial na biblioteca digital de qualquer programador Windows Phone que se preze! ;)

MCP Update: “PD: Windows Phone 7 Developer″

Apesar de já ter realizado o exame 70-599 PRO: Designing and Developing Windows Phone Applications há vários meses atrás, apenas agora a certificação relativa a este ficou activa: Professional Developer: Windows Phone 7 Developer!

Até ao lançamento do Windows Phone “Mango” e posterior actualização dos conteúdos dos exames e certificações, esta é a certificação máxima que se consegue obter no que toca a desenvolvimento para Windows Phone! :)

Silverlight for Windows Phone Toolkit – Aug 2011

Foi ontem disponibilizada a actualização de Agosto do Silverlight for Windows Phone Toolkit, sendo que esta versão foi criada com base no SDK do Windows Phone “Mango”, e como tal não pode ser utilizado com a versão anterior!

Para além dos controlos e componentes que já existiam nas versões anteriores, podemos agora contar com os seguintes:

  • LongListSelector foi reconstruido e redesenhado para tirar partido do novo sistema de smooth scroling do “Mango”
  • MultiSelectList que permite a selecção múltipla de items, semelhante à experiência da aplicação de Mail
  • LockablePivot adiciona um modo especial ao controlo Pivot em que apenas o item actual é apresentado
  • ExpanderView é um controlo de items que pode ser utilizado para expandir e colapsar items (como a vista em thread na aplicação de Mail)
  • HubTile permite adicionar Tiles animados e informativos à aplicação, semelhante aos grupos no hub People do “Mango”
  • ContextMenu foi redesenhado, de forma a melhorar a performance e a consistência visual
  • ListPicker permite agora multiplas selecções
  • RecurringDaysPicker permite aos utilizadores escolherem um dia da semana
  • Date & TimeConverters devidamente localizados em 22 linguas, permitem aos programadores apresentarem a data e hora na interface de uma forma relativa (por exemplo, “ontem” ou “há um mês atrás”)
  • Page Transitions foram melhoradas e estão agora muito mais suaves
  • PhoneTextBox é a primeira  versão de um controlo TextBox avançado que permite utilização de icon para acções, marca de água, etc.
  • Todas as mensagens de erro e elementos de interface foram localizados para todas as línguas suportadas, melhorando a experiência para os utilizadores de todo o mundo!

Prometido está ainda o lançamento de uma versão compatível com o Windows Phone “pré-Mango”, que poderá ser publicada em alguns dias!

Podem ainda ler o artigo oficial no blog da equipa do Windows Phone e mais alguma informação no blog do Jeff Wilcox, Senior Software Developer na Silverlight Phone & Devices team!

Nota: com esta nova versão e com a reconstrução do controlo ListPicker, deixa de ser necessária a alteração que aqui coloquei anteriormente para resolver os problemas de scrolling com listas de muitos items!

ListPicker a… cafeína!!!

Actualizado a 18/08/2011: este artigo deixa neste momento de ser válido, dado que a Microsoft já disponibilizou a actualização de Agosto de 2011 para o Silverlight for Windows Phone Toolkit, o qual resolve a situação aqui descrita! ;)

De todos os controlos que a equipa do Silverlight lançou no Toolkit para Windows Phone 7, o que utilizo com mais regularidade é mesmo o ListPicker!

No entanto, desde que ele apareceu no Toolkit que sempre me senti frustrado com a fraca performance de scrolling deste, quando aberto no modo FullMode!

A razão para essa fraca performance é devida em grande parte ao seguinte bloco de código do ficheiro “\WindowsPhone7\Microsoft.Phone.Controls.Toolkit\Themes\Generic.xaml”:

<ListBox
    x:Name="FullModeSelector"
    Grid.Row="1"
    ItemTemplate="{TemplateBinding ActualFullModeItemTemplate}"
    FontSize="{TemplateBinding FontSize}"
    Margin="{StaticResource PhoneMargin}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/> <!-- Ensures all containers will be available during the Loaded event -->
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

Como podemos aqui ver, na propriedade ListBox.ItemContainer foi colocado um StackPanel, substituindo assim o VirtualizingStackPanel que seria utilizado por omissão!

Esta alteração tem como origem um “hack” que foi introduzido para simular o highlight do item seleccionado na lista, mas mantendo o ListBox.SelectedItem = null.

Mas dada a visível perda de performance, o “hack” torna-se um grande problema, e como tal, vamos ter que o remover!!!

A primeira coisa a fazer é mesmo remover toda a alteração da propriedade ListBox.ItemsPanel que vemos acima, de forma a que este volte a utilizar o VirtualizingStackPanel; para além disso, alterei o modo de selecção da ListBox para que o evento ListBox.SelectionChanged ocorra sempre permitindo seleccionar e desseleccionar items:

<ListBox
    x:Name="FullModeSelector"
    Grid.Row="1"
    ItemTemplate="{TemplateBinding ActualFullModeItemTemplate}"
    FontSize="{TemplateBinding FontSize}"
    Margin="{StaticResource PhoneMargin}"
    SelectionMode="Multiple">
</ListBox>

O passo seguinte é remover o “hack” que podemos encontrar no seguinte bloco de código do ficheiro “\WindowsPhone7\Microsoft.Phone.Controls.Toolkit\ListPicker\ListPicker.cs”:

if (null != _fullModeSelectorPart)
{
    // Find the relevant container and make it look selected
    // Note: Selector.SelectedItem is left null so *any* selection will trigger the SelectionChanged event.
    // However, this doesn't highlight the "currently selected" item; the following technique fakes that.
    ContentControl container = _fullModeSelectorPart.ItemContainerGenerator.ContainerFromItem(SelectedItem) as ContentControl;
    if (null == container)
    {
        // Container isn't always available; defer until it is
        // Note: Assumes the container eventually WILL be available (which is why
        // the default Template replaces VirtualizingStackPanel with StackPanel)
        Dispatcher.BeginInvoke(() => HandleFullModeSelectorPartLoaded(sender, e));
    }
    else
    {
        Brush phoneAccentBrush = Application.Current.Resources["PhoneAccentBrush"] as Brush;
        if (null != phoneAccentBrush)
        {
            container.Foreground = phoneAccentBrush;
        }
    }
    // Scroll item into view if possible
    ListBox listBox = _fullModeSelectorPart as ListBox;
    if (null != listBox)
    {
        listBox.ScrollIntoView(SelectedItem);
    }
}

As linhas marcadas em cima deverão ser todas removidas, mas temos ainda que recolocar o funcionamento do ListBox.SelectedItem, e para isso vamos começar a juntar código ao ficheiro, mais propriamente a linha indicada:

if (null != _fullModeSelectorPart)
{
    _fullModeSelectorPart.ItemsSource = Items;
    _fullModeSelectorPart.SelectedItem = SelectedItem;
    _fullModeSelectorPart.SelectionChanged += HandleFullModeSelectorPartSelectionChanged;
    _fullModeSelectorPart.Loaded += HandleFullModeSelectorPartLoaded;
}

Falta apenas alterar o tratamento do evento ListBox.SelectionChanged para processar em modo MultiSelect:

if (null != _fullModeSelectorPart)
{
    object selectedItem = SelectedItem;

    if (e.AddedItems.Count > 0)
        selectedItem = e.AddedItems[0];
    else if (e.RemovedItems.Count > 0)
        selectedItem = e.RemovedItems[0];

    // Commit selected item
    if (SelectedItem != selectedItem)
    {
        SelectedItem = selectedItem;
    }
    else
    {
        // User selected the already-selected item; just switch back to Normal view
        ListPickerMode = ListPickerMode.Normal;
    }
}

E está pronto: passamos a ter um ListPicker devidamente optimizado com o VirtualizingStackPanel!

Para facilitar, os passos acima estão disponíveis neste patch que eu criei especificamente para quem utiliza o TortoiseSVN para obter o código do Silverlight Toolkit directamente do Codeplex!

Silverlight for Windows Phone Toolkit – Feb 2011

Foi publicada mais uma actualização ao Silverlight for Windows Phone Toolkit, e de entre os vários melhoramentos e correcções, apresenta ainda as seguintes novidades:

  • TiltEffect
  • PerformanceProgressBar

Apesar de não serem necessariamente “novos controlos” (dado que já andam pela Internet à muito tempo), estes passam agora também a figurar dentro do Toolkit, dado o enorme número de pedidos feitos pela comunidade para tal.

Para além disso, as samples foram actualizadas para agora estarem disponíveis em C# e VB.NET!