Behavior para filtrar galerias Deep Zoom por tags

Acabei de publicar no Expression Gallery uma behavior para filtrar imagens em uma colleção do Deep Zoom.

image

Essa behavior, quando aplicada a um objeto do tipo MultiScaleImage, permite que se filtre as imagens dessa coleção de forma semelhante ao que acontece no site Memorabilia do HardRock Café.

O uso da behavior é muito simples:

  • Anexe a behavior à um objeto MultiScaleImage.
  • Defina as propriedades Source e MetadataUri da behavior respectivamente para a url da galeria e o arquivo de metadados da galeria.
  • Defina o valor da propriedade Filter da behavior para o filtro que quer aplicar.

A behavior trabalha com o arquivo de metadados gerado pelo Deep Zoom Composer para saber quais tags estão associadas a cada imagem. Ela entende tags separadas por vírgula (,) tanto para atribuir às imagens quanto para filtrar. Filtrar por múltiplas tags vai exibir todas as imagens que tenham pelo menos uma das tags do filtro.

O arquivo de metadados não precisa ser necessáriamente o mesmo gerado pelo Composer, mas deve ter o mesmo formato. A behavior o campo ZOrder do arquivo de metadados para saber qual é cada imagem, portanto, se esse arquivo for gerado manualmente deve se tomar o cuidado de garantir que estão sendo atribuídas as tags às imagens certas e sempre que a galeria for atualizada o arquivo de metadados também precisará ser atualizado.

A behavior também expõe uma propriedade (AvailableTags) que é um array contendo todas as tags disponíveis na galeria atual. Isso pode ser bem útil se quisermos exibir na tela todas as tags, como fiz no exemplo que está no Expression Gallery.

Cada vez que o filtro for alterado, a galeria será filtrada e ocorrerá uma animação para exibir as imagens desejadas. É possível controlar o tempo dessa animação e sua função de Easing.

As imagens são posicionadas de forma a preecher o espaço do controle da melhor forma possível, mas ainda preciso melhorar a lógica para quando apenas uma imagem é exibida.

Também há espaço para melhorias no algorítmo de posicionamento, no que diz respeito ao alinhamento das imagens do lado direito.

O código fonte está disponível no Codeplex. Sugestões, melhorias e bug fixes podem ser reportados lá ou aqui no blog.

Em breve estarei aumentando essa biblioteca do Codeplex com outras behaviors e helpers.

Ahhh, quem gosta de futebol pode ver essa behavior em ação em http://www.msnnacopa.com.br.

Silverlight 4 - Novo xaml parser e suporte namespaces xml

O Silverlight 4 foi lançado na semana passada é já existe uma tonelada de posts com informações a respeito das novidades. Eu estava lendo um post do blog do Silverlight SDK e encontrei uma novidade interessante sobre a qual não se está falando muito. O parser de xaml do Silverlight 4 agora respeita corretamente as definições de namespace xml. Isso tem várias implicações:

  • Agora o namespace padrão dos seus arquivos xml não precisa mais ser “http://schemas.microsoft.com/winfx/2006/xaml/presentation”. Você pode mudar se for útil/necessário para sua aplicação (por exemplo, se você estiver gerando xaml dinamicamente utilizando apenas controles customizados).
  • Com esse suporte, agora é possível criar os seus próprios namespaces, agrupando vários namespaces da sua apliação ou mesmo de diversos assemblies distintos.
  • Frameworks como o Silverlight Toolkit e o SDK já estão tirando proveito disso, definindo seus próprios namespaces para simplificar sua utilização e eliminar a necessidade de ter que conhecer toda a estrutura desses projetos para saber onde estão os controles que queremos usar.

Ou seja, agora é possível ter acesso a todos os controles do Silverlight Toolkit ou SDK acrescentando apenas 2 namespaces na sua tela, como abaixo (mas lembre-se que ainda é necessário fazer referencias as dlls):

xmlns:toolkit=”http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit xmlns:sdk=”http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk

Tudo isso é muito interessante e muito legal mas o que me deixou intrigado é que eu não estava conseguindo encontrar informações em nenhum lugar que explicassem como é que eu poderia fazer meus frameworks e apis tirarem proveito desses recursos. Cheguei até a achar por um momento que esses novos namespaces estivesses fixos no Silverlight 4, mas como não era esse o discurso, tinha que have um jeito de implementarmos isso em nossas aplicações.

Foi então que eu tive a idéia de seguir um conselho que o Scott Hanselman vive repetindo quase como um mantra que é “ler código alheio para se tornar um programador melhor”. Tendo isso em mente eu fui ao codeplex e comecei a fuçar no código fonte do Silverlight Toolkit, até que achei o que estava procurando. Para que você possa tirar proveito desse recurso em suas próprias aplicações e frameworks, basta marcar o assembly com os atributos XmlnsPrefix e XmlnsDefinition, como demonstrado abaixo:

[assembly: XmlnsPrefix(http://schemas.wf.com.br/sdk, "wf")] [assembly: XmlnsDefinition(http://schemas.wf.com.br/sdk, "WF.Silverlight")] [assembly: XmlnsDefinition(http://schemas.wf.com.br/sdk, "WF.Silverlight.Controles")]

O lugar ideal para definir esses atributos é no arquivo AssemblyInfo do projeto. Para poder utilizar esses atributos é necessário referenciar o namespace System.Windows.Markup nas instruções de using no top da página.

O atributo XmlnsPrefix serve para criar um namespace e pré-definir qual será o seu prefixo quando um controle for adicionado diretamente pelo Visual Studio ou Expression Blend. Geralmente haverá apenas 1 atributo desse por projeto.

O atributo XmlnsDefinition é o responsável por vincular um namespace xml com um namespace do assembly. Esse atributo pode ser adicionado ao assembly quantas vezes for necessário. Geralmente haverá um atributo desse para cada namespace do assembly que contenha controles ou elementos que se deseja disponibilizar no xaml.

Uma coisa muito interessante que eu descobri é que os namespaces que você criar aparecem no intellisense do Visual Studio 2010, como pode ser visto abaixo:

 image

Espero que essas dicas tenham sido úteis. Eu sei que vou tirar proveito dessa nova funcionalidade nos meus próximos projetos.

Update 30/04/2010 : Encontrei um problema na implementação que demonstrei aqui. Devido a uma limitação do compilador do Silverlight, não é possível atribuir a propriedade x:Name a um controle definido por meio do novo xmlns se esse controle fizer parte do mesmo assembly em que está sendo utilizado. Ficou meio confuso, então vou tentar dar um exemplo:

Temos uma solution com um projeto. Esse projeto tem o seguinte xmlns:  xmlns:my=http://schema.minhaempres.silverlight e um controle chamado ControleA que está sendo “coberto” por esse xmlns. Se eu criar um ControleB nesse projeto, definir o uso do namespace “my” e utilizar o ControleA com a seguinte sintax, vai funcionar : . Se eu tentar atribuir a propriedade x:Name no meu ControleA, não vai mais funcionar. O problema é apenas com a propriedade x:Name e apenas se ambos os controles estiverem no mesmo assembly. Muitas vezes a gente consegue criar telas inteiras sem precisar dar nomes aos campos, principalmente graças ao uso de data binding, mas se for necessário fazer alguma animação, manipular o controle via code behind ou utilizar em algum TemplatePart de outro controle, tem que ter name.

Agora a boa notícia. Como esse erro só acontece se os 2 controles em questão estiverem no mesmo assembly, o workaround é simples, basta utilizar a declaração convencional de xmlns que usamos normalmente, onde dizemos o nome do assembly e namespace da classe.

Silverlight 4 RTM disponível para download

O Silverlight 4 RTM já está disponível para download.

O runtime do Silverlight 4 tem apenas 6 Mb. Em comparação, o Silverlight 3 tinha 4,7 e o Silverlight 2 tinha 4,77 (sim, o Silverlight 2 era maior que o Silverlight 3).

O Silverlight 4 Tools do para Visual Studio 2010 também está disponível para download no mesmo site. Se você pretende desenvolver aplicações utilizando Silverlight 4, este é o download que você deve fazer. Ele tem aproximadamente 30 Mb e é composto dos seguintes pacotes:

  • Runtime do Silverlight 4 RTW para desenvolvimento
  • SDK do Silverlight 4 RTW
  • Tooling para Visual Studio 2010 RTM (ferramentas e templates de projeto)
  • WCF RIA Services Release Candidate (com licença go-live)

Por conter a versão Release Candidate do WCF RIA Services, o Silverligth 4 Tools para Visual Studio 2010 também está marcado como RC, mas isso não significa que ele não esteja pronto para ser utilizado em produção. Prova disso é que o WCF RIA Services RC vem com licença go-live, que significa que já pode ser utilizado publicamente e terá suporte da Microsoft. A versão RTW do WCF RIA Services e, consequentemente, do Silverlight 4 Tools deve ser lançada ainda nesse semestre.

Também foram liberados hoje o Silverlight 4 Toolkit – Abril 2010 e o Expression Blend 4 Release Candidate. A versão final do pacote Expression Studio 4 também deve ser lançada ainda nesse semestre, mas não há nenhuma data definida. Vale lembrar que o upgrade do Expression 3 para o 4 será gratuito, portanto, se você não tem ainda não precisa esperar sair a próxima versão. Pode comprar agora.

Código fonte da demo do webcast MSDN sobre Silverlight4 + MEF

image

Hoje fiz um webcast ao vivo no MSDN sobre extensibilidade e otimização de aplicações em Silverlight 4 utilizando MEF. Em alguns dias este webcast estará disponível para download e eu atualizarei este post com o link para download do vídeo.

A demo que fiz durante o webcast foi feita utilizando o Visual Studio 2010 RTM e o Silverlight 4 RTM. No final desse post tem um link para baixar o arquivo com os fontes e o pptx da apresentação.

Abaixo tem também alguns links úteis sobre o assunto. Se tiverem alguma dúvida, basta postar um comentário aqui ou me mandar uma mensagem pelo Twitter, MSN ou email.

 

 

Update: Para quem assistiu ao webcast ao vivo, o minha última demo não funcionou corretamente mas o código fonte anexo já está “corrigido”. O problema estava na ordem que as ações estavam sendo executadas. O código ao vivo estava chamando a função DownloadAsync para baixar o xap adicional antes de incluí-lo no catálogo mestre. Acontece que ao fazer isso, o download estava terminado muito rápido, e quando chegou no catálogo mestre ele acabou não recompondo a aplicação. O código corrigido simplesmente inverte a ordem dessas 2 linhas no App.xaml.cs, fazendo com que a recomposição funcione.

 

MIX10 – Resumo

Essa semana aqui em Las Vegas foi uma loucura. Depois da aventura que foi chegar aqui, teve a correria do dia a dia da conferência. Só agora (que estou no aeroporto esperando meu vôo para voltar para casa) que consegui tempo para organizar minhas ideias e atualizar o blog.

Segunda Feira

Para começar, não consegui uma conexão de internet durante o keynote do primeiro dia e ainda peguei um lugar desfavorável para tirar fotos. O keynote foi excelente e teve como foco o Windows Phone 7. Muita coisa interessante foi demonstrada e o aparelho parece ser fantástico. Queria muito poder ter um  agora mesmo. Com certeza eu comprarei um assim que for lançado.

Após o keynote fui passear no The Commons. Essa era uma área onde tudo acontecia e todos se encontravam quando não estavam em alguma session. Lá encontrei Tim Heuer e John Papa, e aproveitei para gravar um pequeno podcast em vídeo com cada um para o XAMLCast. Esses vídeos, assim como outros que gravei serão publicados no XAMLCast em breve. Foi ótimo conversar com eles. Eu estava preocupado em como me sairia com o inglês pois essa foi minha primeira viagem para fora do Brasil e fiquei muito contente mesmo por ter meu inglês elogiado pelo Tim e John. It was AWESOME!

Depois fui assistir uma session de Windows Phone 7 com Chalie Kindel. Achei que foi muita maldade dos palestrantes ficarem demonstrando o aparelho em todas as session sabendo que não poderíamos ter um (brincadeira, é lógico que achei ótimo ver o aparelho. estou apenas com inveja). Passei o resto do dia no Commons tentando conversar com outras pessoas para gravar para o XAMLCast mas não consegui pois todos estavam correndo.

P1110627 P1110650

A noite fui fazer compras no outlet e depois passear pela Strip (Las Vegas Boulevard) com outros brasileiros que estavam no evento. Assistimos ao show das fontes do Bellagio do topo da torre Eiffel, no cassino Paris. Aproveitei para tirar algumas fotos da cidade enquanto estava lá.

Terça Feira

P1110708 P1110544 P1110753 P1110815

Na terça feira eu peguei um lugar ótimo no keynote e consegui uma conexão estável de internet. Tirei muitas fotos e twitei o tempo todo durante o keynote. Fiquei muito impressionado com o progresso do IE9 e absolutamente maravilhado com a apresentação de Bill Buxton. O cara é genial.

Após o keynote, assisti a mais uma session e depois fui para o Commons novamente. Consegui gravar apenas com o Pete Brown neste dia e ainda desligaram a luz enquanto estavamos gravando. Espero que a gravação tenha ficado boa. Fui convidado para participar da trívia no Channel 9 Live com Scott Hanselman mas eu seria chamado apenas se alguém amarelasse e isso não ocorreu. Mas eu respondi a pergunta de qual era o code nome do Windows 95 (se vocês assistirem, o Scott até fala que eu ganhei um ponto por isso :D ). Quase morri de rir assistindo à trívia.

A noite eu tentei ir a uma festa dos Blend Insiders mas não consegui achar o endereço. Depois dei uma passada na GameStop da galeria próxima ao Venetian. Na volta fui para meu quarto para tirar um cochilo antes de ir para a festa no LAX e só acordei do cochilo na manhã seguinte. Estava exausto.

Quarta Feira

P1110876 P1110886

Na quarta feira eu fui assistir a uma session excelente sobre a arquitetura da plataforma do Windows Phone 7 e fui convidado para participar de um grupo de foco sobre Windows Phone 7 e dar feedback sobre o que achava sobre como está sendo feito o lançamento e quais eram as preocupações que tinhamos. Infelizmente não posso divulgar o que foi conversado no grupo de foco por causa de NDA (Non Disclosure Agreement). O importante é saber que eles estão ouvindo e vão levar em considração várias das preocupações que as pessoas estão tendo.

A noite fui fazer minhas últimas compras e depois fui com uns amigos da Microsoft Brasil assistir ao Cirque du Soleil –“O” no Bellagio. Que espetáculo maravilhoso! Pressinto mais uma coleção de DVD em minhas prateleiras em breve, mas essa eu farei com calma.

Durante esta viagem eu devo ter andado uns 40 Km no total. O mapa de Las Vegas engana e os lugares são muito mais longe do que parece. Minhas pernas não gostam mais de mim… O clima em Las Vegas é muito seco e estou com a boca toda rachada e nariz ressecado. Conheci muita gente, treinei meu inglês falado, me diverti bastante e aprendi muito. Não ganhei nada no cassino :(.

Em breve vou começar a postar aqui algumas dicas e tutoriais sobre desenvolvimento em Silverlight 4, Windows Phone 7 e afins. Os vídeos que gravei para o XAMLCast serão publicados em breve. Fiquem ligados e até mais.