Sie sind auf Seite 1von 10

2

2.1 XAML

CONCEITOS BSICOS

A utilizao da plataforma Silverlight pressupe o conhecimento de algumas funcionalidades bsicas que sero introduzidas ao longo deste captulo. Iniciemos, ento, este captulo com uma apresentao da linguagem XAML, para em seguida nos debruarmos sobre dependency properties, routed events e comandos.

XAML (Extensible Application Markup Language) uma linguagem declarativa usada na construo e inicializao de objectos .NET. A XAML uma linguagem XML, logo a capitulao dos nomes dos elementos importante e deve ser respeitada.
Uma linguagem declarativa preocupa-se em expressar a lgica de uma determinada computao sem se prender aos pormenores associados ao seu fluxo de controlo. Por outras palavras, uma linguagem declarativa indica apenas o que deve ser feito. Por outro lado, uma linguagem imperativa prefere explicitar a forma como a operao deve ser executada.

Esta linguagem introduz alguns termos reservados (designados por directivas) e define as regras que permitem aos parsers interpretarem e transformarem o XML em objectos .NET. Em Silverlight, a XAML usada (maioritariamente) para definir as interfaces grficas das aplicaes.
Um parser que um componente que analisa o texto e o transforma num conjunto de tokens que so mapeados numa determinada gramtica. Neste caso, o parser limita-se a interpretar o texto e a transformar as tags e atributos a definidos em objectos .NET.

FCA Editora de Informtica

28

SILVERLIGHT 4.0 CURSO COMPLETO

2.1.1

ELEMENTOS E ATRIBUTOS

A linguagem XAML define um conjunto de regras que so usadas por um parser para transformar um elemento XML num objecto .NET. Analisemos o excerto XAML seguinte:
XAML

<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml x:Name=bt Content="Ola" />

O excerto anterior cria um novo elemento do tipo Button e (praticamente) equivalente ao seguinte cdigo C#:
C#

Button bt = new Buttton{ Content = Ola };

Este exemplo permite-nos deduzir duas coisas: o nome de um elemento XAML tem de ser o mesmo de uma classe .NET (no esquecer a capitulao!) e os atributos definidos no XML so copiados para propriedades homnimas do objecto instanciado a partir do elemento XAML.

2.1.2

NAMESPACES

O leitor atento ter, porventura, reparado na utilizao de dois namespaces XML (um global, com o valor http://schemas.microsoft.com/winfx/2006/-> xaml/presentation e outro associado ao prefixo x - http://-> schemas.microsoft.com/winfx/2006/xaml). O primeiro namespace (global) est associado a vrios namespaces .NET definidos pela plataforma Silverlight (atravs do atributo XmlnsDefinitionAttribute ver nota seguinte para mais informaes). O segundo (associado ao prefixo x) permite a utilizao de directivas XAML. atravs destes mapeamentos que o parser consegue transformar o XML em objectos .NET e interpretar as directivas XAML.
Refira-se ainda que estes namespaces so normalmente definidos no elemento de topo das pginas Silverlight, pelo que a sua declarao no necessria ao nvel dos controlos.

FCA Editora de Informtica

CONCEITOS BSICOS
2.1.2.1 DIRECTIVAS INTRODUZIDAS PELA XAML

29

O exemplo inicial ilustra a utilizao de uma dessas directivas (Name). A directiva Name permite indicar o nome do campo usado para representar o elemento na classe gerada a partir do ficheiro XAML. No exemplo anterior, o parser adiciona um campo, designado por bt, classe parcial gerada, permitindo assim o fcil acesso a esse elemento a partir do cdigo C#. Para alm da directiva Name, existem ainda outras que so interpretadas pelo parser de Silverlight. A directiva x:Class usada para indicar o nome da classe parcial obtida custa do parsing do ficheiro de XAML. Esta directiva aplicada ao elemento UserControl (elemento de topo de um user control Silverlight) quando pretendemos utilizar ficheiros de code-behind:
XAML

<UserControl x:Class="QuickTests.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> </UserControl>

Para alm destas, existem ainda outras no apresentadas nestes exemplos. A directiva x:Key usada para identificar univocamente um elemento criado como recurso num elemento Silverlight (os recursos so apresentados no Captulo 5 deste livro). Para alm destas directivas, este namespace est ainda associado a um conjunto de extenses de markup que sero apresentadas nas prximas seces deste captulo.

2.1.2.2 UTILIZAO DE OBJECTOS CRIADOS PELO PROGRAMADOR

Nesta altura, o leitor pode estar a interrogar-se acerca dos tipos de objectos que podem ser definidos atravs de XAML. A resposta simples: qualquer objecto .NET que possua um construtor pblico sem parmetros pode ser usado a partir de XAML. Para que esse elemento seja correctamente interpretado pelo parser, temos apenas de associar o namespace XML do elemento XAML ao namespace .NET onde a classe foi definida. Por exemplo, suponhamos que crimos o controlo seguinte:
C#

namespace QuickTests { public class MyButton:Button {


FCA Editora de Informtica

30

SILVERLIGHT 4.0 CURSO COMPLETO }

A utilizao do tipo MyButton em XAML obriga-nos a associar o namespace .NET Quicktests a um prefixo XML:
XAML

<my:MyButton xmlns:my="clr-namespace:QuickTests" Content="Ola" />

Como bvio, a introduo do prefixo my pode ser efectuada ao nvel do elemento de topo de um user control Silverlight que estamos a desenvolver (como vimos no captulo anterior, normalmente um objecto do tipo UserControl). A utilizao de tipos .NET, definidos em assemblies externas, tambm possvel. Para tal, temos apenas de indicar a assembly atravs do termo reservado assembly na string do namespace:
XAML

<my:MyButton xmlns:my="clr-namespace:QuickTests;assembly=MyAssembly" Content="Ola" />

Importa salientar que os termos reservados (clr-namespace e assembly) e separadores especiais (: e =) devem ser respeitados. A utilizao incorrecta dos separadores um dos erros mais usuais entre os principiantes.
A plataforma Silverlight introduz dois atributos que simplificam a interaco com namespaces .NET: XmlnsDefinitionAttribute e XmlnsPrefixAttribute. O primeiro permite associar um namespace XML (identificado por um URI Uniform Resource Identifier) a todos os namespaces definidos numa assembly. Por sua vez, o segundo define o prefixo usado por predefinio aquando da importao dessa assembly. Dos dois, o primeiro , sem dvida, o mais importante. As assemblies Silverlight recorrem a esta estratgia para associar vrios namespaces .NET a um mesmo namespace XML. Se abrirmos a assembly System.Windows com um leitor de meta-data (ex.: .NET Reflector), encontramos vrias instrues deste tipo:
C#

[assembly: XmlnsDefinition( "http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows")] O excerto anterior efectua o mapeamento do namespace .NET System.Windows no namespace XML
FCA Editora de Informtica

CONCEITOS BSICOS

31

http://schemas.microsoft.com/winfx/2006/xaml/presentation. Como possvel verificar, este namespace XML precisamente o mesmo que temos vindo a usar como namespace XML global nos exemplos anteriores. Durante o processo de compilao, o parser recorre meta-data e capaz de efectuar o mapeamento deste namespace XML nos namespaces .NET introduzidos pelas assemblies. Para alm deste namespace predefinido, existem ainda outros dois que sero muito usados ao longo deste livro: http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk e http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit. O primeiro identifica os vrios namespaces .NET introduzidos pelas assemblies do SDK (Software Developer Kit) do Silverlight; por sua vez, o segundo identifica os vrios namespaces .NET introduzidos pelo Silverlight Toolkit. A utilizao deste atributo simplifica o cdigo XAML, j que podemos simplesmente referir esse namespace XML para termos acesso a todos os objectos definidos nos vrios namespaces .NET que foram previamente associados a esse URI. Sempre que criamos novas assemblies Silverlight, podemos (e devemos!) recorrer a este atributo para associar um namespace XML aos namespaces .NET contidos na nossa assembly.

2.1.3

ELEMENTO-PROPRIEDADE

O exemplo inicial atribua uma simples string de texto propriedade Content do boto. A atribuio de um valor simples a uma propriedade em XAML geralmente efectuada atravs de atributos. Contudo, o XAML suporta ainda uma outra sintaxe para atribuio de valores: a utilizao de elementos internos para definio de propriedades (elemento-propriedade). O excerto seguinte ilustra esta opo:
XAML

<Button x:Name="bt"> <Button.Content>Ola</Button.Content> </Button>

Esta no a nossa melhor opo quando queremos definir contedo simples (como a string anterior). Contudo, suponhamos que queremos utilizar contedos grficos no interior do nosso boto (note-se que a propriedade Content do tipo Object). Para exemplificar este cenrio, suponhamos que o contedo do boto ser uma elipse:
XAML

<Button x:Name="bt"> <Button.Content>


FCA Editora de Informtica

32

SILVERLIGHT 4.0 CURSO COMPLETO <Ellipse Fill="Red" Stretch="Fill" Width="100" Height="100" />

</Button.Content>

FIGURA 2.1 Utilizao da sintaxe propriedade-elemento para definir contedo de boto

elemento-propriedade segue sempre a forma <elemento.nomePropriedade> e s vlida quando definida no interior de um elemento XML que representa um objecto .NET. No exemplo anterior, somos mesmo obrigados a recorrer a esta sintaxe, j que no h nenhuma string capaz de descrever a elipse que pretendamos atribuir propriedade Content que possa ser interpretada pelo parser. A markup XAML utilizada no exemplo anterior pode ainda ser simplificada:
XAML

sintaxe

<Button x:Name="bt"> <Ellipse Fill="Red" Stretch="Fill" Width="100" Height="100" /> </Button>

Tal deve-se existncia das chamadas propriedades de contedo. Uma propriedade de contedo permite-nos definir o valor de uma propriedade directamente no interior do seu elemento XAML. Uma classe pode recorrer ao atributo ContentPropertyAttribute para indicar qual a sua propriedade de contedo. No caso do controlo Button (que herda indirectamente de ContentControl), a propriedade de contedo a propriedade Content, como podemos verificar atravs do excerto seguinte:
C#

[ContentProperty("Content", true)] public class ContentControl : Control {

Quando o parser est perante uma classe que utiliza este atributo, todo o XML definido no interior de um elemento (no atribudo especificamente a uma
FCA Editora de Informtica

CONCEITOS BSICOS

33

propriedade atravs da sintaxe elemento-propriedade) automaticamente associado propriedade identificada pelo atributo ContentPropertyAttribute.
Existem restries para utilizao de objectos em XAML? A utilizao de uma classe em XAML obriga-nos a respeitar alguns requisitos. O primeiro aspecto a ter em conta que apenas podemos utilizar classes no encadeadas (ou embebidas tambm conhecidas como nested classes) que disponibilizem um construtor pblico sem parmetros. As propriedades de uma classe que vai ser usada em XAML devem respeitar os seguintes requisitos: A propriedade deve ser de um tipo primitivo (inteiros, etc.). Propriedades de tipos no primitivos obrigam a que esses tipos possuam construtor pblico sem parmetros ou estejam associados a um conversor capaz de efectuar a sua construo a partir de uma string (os conversores de tipo so apresentados na seco 2.1.5). Para alm de propriedades simples, em XAML tambm podemos atribuir valores a propriedades que representam coleces de elementos. Todas as propriedades cujo tipo seja um elemento do tipo IList ou IDictionary (<TKey, TValue>) so interpretadas como coleces. Nestes casos, a adio de elementos atravs de XAML acaba por resultar na adio de elementos coleco associada a essa propriedade (portanto, convm garantir que essa propriedade retorna um valor no nulo a partir do seu getter). O excerto seguinte ilustra a utilizao desta sintaxe para definir os passos associados a um gradiente (o Captulo 8 apresenta mais informaes acerca de gradientes):
XAML

<Button x:Name="bt" Content="Ola> <Button.Background> <LinearGradientBrush StartPoint="0,0" EndPoint="1,1"> <GradientStop Color="White" Offset="0" /> <GradientStop Color="Red" Offset="0.2" /> </LinearGradientBrush> </Button.Background> </Button>

A utilizao de dicionrios obriga-nos sempre a indicar a chave dessa entrada atravs da directiva XAML x:Key. O excerto seguinte ilustra a adio de uma entrada ao dicionrio de recursos de um UserControl (os recursos so apresentados no Captulo 5):

FCA Editora de Informtica

34
XAML

SILVERLIGHT 4.0 CURSO COMPLETO

<UserControl x:Class="QuickTests.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <UserControl.Resources> <LinearGradientBrush x:Key="bgColor" StartPoint="0,0" EndPoint="1,1"> <GradientStop Color="White" Offset="0" /> <GradientStop Color="Red" Offset="0.2" /> </LinearGradientBrush> </UserControl.Resources> <Button x:Name="bt Content="Ola" Background="{StaticResource bgColor}" /> </UserControl>

A extenso de markup StaticResource permite-nos obter uma referncia para um recurso previamente declarado pela chave indicada (uma vez mais recordamos que os recursos so apresentados detalhadamente no Captulo 5).

2.1.4

EVENTOS

Em XAML, tambm podemos configurar handlers para tratamento de eventos. Analisemos o excerto seguinte:
XAML

<Button x:Name="bt" Content="Ola" Click="TrataClique" />


C#

//code-behind void TrataClique(Object sender, EventArgs e) { //efectua operaes }

O mtodo TrataEvento deve ser definido no ficheiro de code-behind associado ao user control Silverlight actual (recordar que a associao com o ficheiro de code-behind feita atravs da directiva XAML x:Class). Apesar de possvel, a definio de handlers em XAML no ser a melhor opo. Uma melhor estratgia passa pela aplicao da directiva x:Name ao elemento e correspondente acesso atravs do ficheiro de code-behind (esta estratgia permite a separao

FCA Editora de Informtica

CONCEITOS BSICOS

35

completa entre a apresentao definida pela XAML e o comportamento definido pelo C#):
XAML

<Button x:Name="bt" Content="Ola" />


C#

//code-behind public MainPage() { InitializeComponent(); bt.Click += (sender, e ) => { /*efectua operaes */ }; }

2.1.5

CONVERSORES DE TIPOS

No exemplo da seco 2.1.3, recorremos a uma string para atribuir o valor propriedade Fill da classe Ellipse. Se consultarmos a documentao, facilmente nos apercebemos de que a propriedade Fill do tipo Brush (uma classe definida pela plataforma Silverlight). Mas ento no deveramos utilizar a sintaxe de elemento-propriedade neste caso? A verdade que tal no necessrio, j que a plataforma suporta o conceito de conversor de tipo (type converter). Um conversor de tipo uma classe que herda de TypeConverter e que responsvel por efectuar a converso de uma string num determinado objecto. Quando o parser interpreta o XAML, tenta sempre encontrar um conversor capaz de efectuar a converso da string XML para a propriedade em causa. A associao de um conversor a um tipo ou propriedade efectuada atravs do atributo TypeConverterAttribute. importante reter que a utilizao de conversores personalizados implica sempre a criao de um novo conversor (isto , de uma classe que herda de TypeConverter) e a utilizao do atributo TypeConverterAttribute para associar esse conversor a uma classe ou propriedade desse tipo. Quando aplicamos o atributo a uma classe, este ser utilizado por todas as propriedades desse tipo expostas por qualquer outra classe; por outro lado, se aplicarmos o atributo a uma propriedade, ento esse conversor ser apenas usado durante a avaliao dessa propriedade.

FCA Editora de Informtica

36

SILVERLIGHT 4.0 CURSO COMPLETO

Refira-se que muitos conversores predefinidos pela plataforma Silverlight so inteiramente construdos em unmanaged code e, por isso, no seguem estas regras (ao contrrio do que acontece, por exemplo, com a plataforma WPF Windows Presentation Framework). Essa a principal justificao por no encontrarmos muitos conversores no cdigo IL da plataforma Silverlight.

2.1.6

EXTENSES DE MARKUP

As extenses de markup so outro dos mecanismos de expanso do XAML. Estas extenses so delimitadas por chavetas ({ }) no XAML. Sempre que o parser encontra uma propriedade (definida atravs da sintaxe de atributo ou de elemento-propriedade) cujo valor est delimitado por chavetas, ento esse valor interpretado como uma extenso de markup (e no como uma string que ser atribuda directa ou indirectament a uma propriedade). A plataforma Silverlight introduz vrias extenses de markup, apresentadas na tabela seguinte:
NOME Binding DESCRIO Utilizada em cenrios de data binding de forma a permitir a actualizao de propriedades em run time. O Captulo 7 apresenta mais detalhes sobre este tipo de operaes. Usada para atribuir um recurso definido num dicionrio a uma propriedade de um elemento. O Captulo 5 apresenta mais informaes acerca desta extenso. Utilizado na definio de templates. Permite ligar uma propriedade de um controlo usado como template propriedade do controlo cuja interface est a ser modificada atravs do template. O Captulo 6 apresenta mais informaes sobre esta extenso. Permite referenciar outro elemento presente na rvore de controlos XAML. Pode ser usada de forma a obter uma referncia ao prprio controlo (Self possibilita cenrios de data binding onde o objecto fonte deve tambm ser usado como objecto destino) ou de forma a obter uma referncia para o controlo cujo template est a ser definido (TemplatedParent). Esta extenso serve para atribuir o valor null propriedade de um elemento definido em XAML.

StaticResource

TemplateBinding

RelativeSource

X:Null

TABELA 2.1 Extenses de markup introduzidas pela plataforma Silverlight

FCA Editora de Informtica

Das könnte Ihnen auch gefallen