20 abril, 2010

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 : <my:ControleA />. 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.

15 abril, 2010

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.