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!

3º Seminário TI&PRO PocketPT

Caminhamos a passos largos para o 3º Seminário TI&PRO PocketPT, um evento sobre Windows Phone direccionado especialmente para os profissionais da área da mobilidade!

Iremos ter oradores de grande relevância no panorama nacional da mobilidade, bem como os oradores do PocketPT e da Microsoft Portugal que iram sem dúvida enriquecer o evento e os seus participantes em termos de conteúdos.

O evento realiza-se no próximo dia 28 de Maio (sábado) e será no Auditório da Microsoft Portugal no Tagus Park, sendo de inscrição gratuita para todos os interessados!

Desmistificando o “Copy & Paste”

A última versão do Windows Phone 7 (com nome de código “NoDo”) apresentou uma nova funcionalidade largamente pedida por todos: capacidade para copiar e colar texto (copy & paste)!

A sua utilização é muito simples: em qualquer caixa de texto (e no Internet Explorer), basta carregar numa palavra para que apareça de imediato os selectores de início/fim de selecção, modificar a selecção arrastando os selectores conforme o pretendido, e carregar no pequeno icon de cópia que aparece junto ao texto.

Depois é ir à caixa de texto onde pretendemos colar o texto, e carregar no botão que aparece logo acima do teclado (uma dica: podem fazer multiplas colagens simplesmente deslizando o dedo na área do botão de “colar” para que ele torne a aparecer).

Seguindo a documentação disponibilizada pela Microsoft, quem desenvolve aplicações para o Windows Phone 7 tem apenas que colocar na interface controlos TextBox para que automaticamente o sistema operativo disponibilize esta funcionalidade nesses controlos!

Pelo menos para já, não é possível programaticamente aceder à funcionalidade de copy & paste, logo esta apenas pode ser invocada explicitamente por acção do próprio utilizador.

Mas aqui surge uma questão que tenho visto ser feita vezes sem conta: como fazer copy & paste em controlos TextBlock? Bem, na verdade, tal não é possível, mas podemos no limite fazer com que uma TextBox seja apresentada e se comporte como um TextBlock!!

Para isso, podem usar o seguinte Style nas vossas aplicações:

<Style x:Key="ReadOnlyTextBox" TargetType="TextBox">
    <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}" />
    <Setter Property="IsReadOnly" Value="True" />
    <Setter Property="TextWrapping" Value="Wrap" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <Grid>
                    <ContentPresenter x:Name="ContentElement" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Assim, o passo seguinte será substituir os controlos TextBlock por TextBox e aplicar o estilo ReadOnlyTextBox para que estas passem visualmente a ser como os TextBlock, mas com a funcionalidade de copy & paste sempre presente! :)

Windows Phone 7 Pro Beta Exam

Estão abertas as inscrições para o exame beta 70-599 Pro: Designing and Developing Windows Phone 7 Applications!

Sendo um exame em versão beta, geralmente é mais longo que a versão final, e para o qual não existe ainda muita documentação de estudo (para além de toda a conhecida sobre desenvolvimento para Windows Phone 7 – e que não é nada pouca!), mas que tem a vantagem de ser totalmente gratuíto!

Todos os que passarem no exame beta com sucesso, vão ficar a dois passos de obter a certificação “Microsoft Certified Professional Developer: Windows Phone 7, Developer”, não tendo assim a necessidade de efectuar à posterior o exame em versão final (para ficarem com esta certificação, tem ainda de realizar com sucesso os exames de WCF (70-513) e de ADO.NET (70-516) )!

Para se registarem, devem-no fazer através da página da Prometric, e quando for requirido, introduzir o código WP599 para que este fique a custo zero!

Uma nota final: as inscrições para estes exames são sempre limitadas, por isso não percam tempo e façam a vossa inscrição o quanto antes para garantirem o vosso lugar! ;)

Para mais informações, consultem este post no blog Born to Learn!

(Nota: corrigido a informação incorrecta sobre a certificação obtida – obrigado ao Caio Proiete pela correcção ;) )

“NoDo” já está em distribuição!

A segunda actualização ao Windows Phone 7 (com o nome de código NoDo) está já em distribuição, mas tal como se sucedeu aconteceu com a primeira actualização, também esta não passa incólume de problemas

A situação é que, apesar da Microsoft ter dado a actualização por “pronta para distribuição” no passado dia, esta está agora dependente da “boa vontade” dos operadores, que são os responsáveis pela fase final de testes antes da verdadeira distribuição; resultado: a maior parte dos equipamentos está ainda por receber a tão esperada actualização que, entre outras coisas, vem com a muito pedida funcionalidade de “copiar e colar” (copy & paste).

A Microsoft criou uma página para permitir aos utilizadores saberem em que estado está a distribuição da actualização conforme os operadores, mas isto ainda assim revelou-se insuficiente dada a escassa informação da mesma!

Ainda assim, é possível recorrer a alguns “hacks” que correm neste momento pela Internet para forçar essa mesma actualização de uma forma relativamente fácil, evitando assim ter que esperar que os operadores se lembrem dos seus utilizadores/clientes!

Samsung Omnia 7 a 299 euros na Fnac online só HOJE

Não tenho por costume fazer este tipo de publicidade no meu blog, mas de facto esta parece-me uma promoção demasiado boa para deixar passar: a Fnac tem até ao final do dia de hoje (30 de Março) à venda no seu site o Samsung Omnia 7 desbloqueado a um preço imbatível de 299 euros (o seu preço regular é de 539.90 euros)!!!

Se tem andado a pensar em adquirir um equipamento Windows Phone 7, mas está a aguardar pela queda dos preços, não poderá arranjar melhor altura que esta para o comprar! :D

WP7 Application Bar Icons

Actualizado a 12-09-2011: a colecção foi aumentada para 132 ícones, contando agora com os novos ícones do Windows Phone “Mango”; podem aceder ao novo artigo aqui!

A equipa de desenvolvimento do Windows Phone 7 colocou no SDK do Windows Phone 7 um conjunto de 32 ícones para serem utilizados pelos programadores nos items da Application Bar dos seus programas.

Para mim, este número revelou-se muito insuficiente para suprir as minhas necessidades, especialmente depois de ver os muitos outros ícones diferentes espalhados pelas aplicações nativas do Windows Phone 7 (a título de exemplo, o ícone do “send” nas mensagens, o icon do “attach” no e-mail, etc.)

Dessa forma, apresento-vos uma colecção de 105 ícones extra relativamente à dos 32 que vem no SDK (cliquem na imagem abaixo para terem uma visualização da colecção no tamanho original)

Grande parte destes ícones são realmente os originais que aparecem nas aplicações do Windows Phone 7 (obtidos binariamente dos “resources” das aplicações), outros foram simplesmente modificados de forma a ficarem com as medidas correctas (modificado o “canvas” para 48×48, o tamanho correcto para este tipo de ícones).

O download da colecção completa pode ser feito aqui - por favor façam link a esta página e não ao ficheiro em si, obrigado!

Bom proveito! :D

Update do WP7 de novo em distribuição

Fui à pouco notificado pelo meu Samsung Omnia 7 de que a primeira actualização para o Windows Phone 7 estava novamente disponível, e ao efectuar essa mesma actualização pude confirmar que desta vez a consegui fazer sem qualquer problema ou dificuldade!

A confirmação de que o update estava novamente online foi feita ontem pelo Michael Stroh no blog do Windows Phone Team.

Limite de aplicação gratuítas no Marketplace aumentado para 100!

E agora, algo completamente inesperado: a Microsoft deu ontem a conhecer através da sua newsletter para os programadores registados no Marketplace, que ia aumentar o limite de aplicações gratuitas de 5 para… 100!!

É assim que se mostra que a Microsoft de facto ouve os pedidos e comentários dos seus programadores, e assim permite uma mais fácil produção de conteúdos para o Marketplace, levando a uma mais rápida massificação do Windows Phone 7!

Update do WP7 desactivado para Samsungs

Depois do lançamento atribulado da primeira actualização para o Windows Phone 7 e dos problemas reportados com os equipamentos Samsung após a instalação, a Microsoft vem agora confirmar que identificou um problema na actualização destes equipamentos especificamente, e como tal desactivou a actualização dos Samsungs.

Existem neste momento um número desconhecido ainda de utilizadores que ficaram com os seus equipamentos WP7 Samsung completamente sem funcionar, tendo apenas a indicação de ligar ao PC, sem a conseguirem remover de forma alguma; a estes utilizadores, a Microsoft está a pedir que se dirijam às lojas e efectuem a troca do seu equipamento por um novo a funcionar.

@WinRumors