Resumo do Capítulo 7. XAML versus código
Observação
Este livro foi publicado na primavera de 2016 e não foi atualizado desde então. Há muito no livro que permanece valioso, mas parte do material está desatualizado e alguns tópicos não estão mais totalmente corretos ou completos.
Xamarin.Forms oferece suporte a uma linguagem de marcação baseada em XML chamada Extensible Application Markup Language ou XAML (pronuncia-se "zammel"). O XAML fornece uma alternativa ao C# na definição do layout da interface do usuário de um Xamarin.Forms aplicativo e na definição de associações entre elementos da interface do usuário e dados subjacentes.
Propriedades e atributos
Xamarin.Forms classes e estruturas tornam-se elementos XML em XAML, e as propriedades dessas classes e estruturas tornam-se atributos XML. Para ser instanciada em XAML, uma classe geralmente deve ter um construtor público sem parâmetros. Todas as propriedades definidas em XAML devem ter acessadores públicos set
.
Para propriedades dos tipos de dados básicos (string
, double
, bool
e assim por diante), o analisador XAML usa os métodos padrão TryParse
para converter configurações de atributo nesses tipos. O analisador XAML também pode lidar facilmente com tipos de enumeração e pode combinar membros de enumeração se o tipo de enumeração for sinalizado com o Flags
atributo.
Para ajudar o analisador XAML, tipos mais complexos (ou propriedades desses tipos) podem incluir um TypeConverterAttribute
que identifica uma classe derivada da TypeConverter
qual dá suporte à conversão de valores de cadeia de caracteres para esses tipos. Por exemplo, o converte ColorTypeConverter
nomes de cores e cadeias de caracteres, como "#rrggbb", em Color
valores.
Sintaxe do elemento de propriedade
Em XAML, as classes e os objetos criados a partir delas são expressos como elementos XML. Estes são conhecidos como elementos de objeto. A maioria das propriedades desses objetos é expressa como atributos XML. Eles são chamados de atributos de propriedade.
Às vezes, uma propriedade deve ser definida como um objeto que não pode ser expresso como uma cadeia de caracteres simples. Nesse caso, o XAML dá suporte a uma marca chamada elemento de propriedade que consiste no nome da classe e no nome da propriedade separados por um ponto. Um elemento de objeto pode então aparecer dentro de um par de tags de elemento de propriedade.
Adicionando uma página XAML ao seu projeto
Uma Xamarin.Forms Biblioteca de Classes Portátil pode conter uma página XAML quando ela é criada pela primeira vez ou você pode adicionar uma página XAML a um projeto existente. Na caixa de diálogo para adicionar um novo item, escolha o item que se refere a uma página XAML ou ContentPage
e XAML. (Não é um ContentView
.)
Observação
As opções do Visual Studio foram alteradas desde que este capítulo foi escrito.
Dois arquivos são criados: um arquivo XAML com a extensão de nome de arquivo .xaml e um arquivo C# com a extensão .xaml.cs. O arquivo C# geralmente é chamado de code-behind do arquivo XAML. O arquivo code-behind é uma definição de classe parcial que deriva de ContentPage
. No momento da compilação, o XAML é analisado e outra definição de classe parcial é gerada para a mesma classe. Essa classe gerada inclui um método chamado InitializeComponent
que é chamado do construtor do arquivo code-behind.
Durante o tempo de execução, na conclusão da InitializeComponent
chamada, todos os elementos do arquivo XAML foram instanciados e inicializados como se tivessem sido criados no código C#.
O elemento raiz no arquivo XAML é ContentPage
. A marca raiz contém pelo menos duas declarações de namespace XML, uma para os elementos e outra definindo um x
prefixo Xamarin.Forms para elementos e atributos intrínsecos a todas as implementações XAML. A marca raiz também contém um x:Class
atributo que indica o namespace e o nome da classe que deriva de ContentPage
. Isso corresponde ao namespace e ao nome da classe no arquivo code-behind.
A combinação de XAML e código é demonstrada pelo exemplo CodePlusXaml .
O compilador XAML
Xamarin.Forms tem um compilador XAML, mas seu uso é opcional com base no uso de um XamlCompilationAttribute
. Se o XAML não for compilado, o XAML será analisado em tempo de compilação e o arquivo XAML será inserido na PCL, onde também será analisado em tempo de execução. Se o XAML for compilado, o processo de compilação converterá o XAML em um formato binário e o processamento de runtime será mais eficiente.
Especificidade da plataforma no arquivo XAML
Em XAML, a OnPlatform
classe pode ser usada para selecionar a marcação dependente da plataforma. Essa é uma classe genérica e deve ser instanciada com um x:TypeArguments
atributo que corresponda ao tipo de destino. A OnIdiom
classe é semelhante, mas usada com muito menos frequência.
O uso de OnPlatform
mudou desde que o livro foi publicado. Foi originalmente usado em conjunto com propriedades chamadas iOS
, Android
, e WinPhone
. Agora é usado com objetos filho On
. Defina a Platform
propriedade como uma cadeia de caracteres consistente com os campos públicos const
da Device
classe. Defina a Value
propriedade como um valor consistente com o x:TypeArguments
atributo da OnPlatform
tag.
OnPlatform
é demonstrada no exemplo ScaryColorList , assim chamado porque contém blocos de XAML quase idênticos. A existência dessa marcação repetitiva sugere que técnicas devem estar disponíveis para reduzi-la.
Os atributos da propriedade content
Alguns elementos de propriedade ocorrem com bastante frequência, como a <ContentPage.Content>
tag no elemento raiz de um ContentPage
, ou a <StackLayout.Children>
tag que inclui os filhos de StackLayout
.
Cada classe tem permissão para identificar uma propriedade com um ContentPropertyAttribute
na classe. Para essa propriedade, as marcas de elemento de propriedade não são necessárias. ContentPage
define sua propriedade de conteúdo como Content
, e Layout<T>
(a classe da qual StackLayout
deriva) define sua propriedade de conteúdo como Children
. Essas marcas de elemento de propriedade não são necessárias.
O elemento de propriedade de Label
é Text
.
Texto formatado
O exemplo TextVariations contém vários exemplos de como definir as Text
propriedades e FormattedText
de Label
. Em XAML, Span
os objetos aparecem como filhos do FormattedString
objeto.
Quando uma cadeia de caracteres de várias linhas é definida como a propriedade, os Text
caracteres de fim de linha são convertidos em caracteres de espaço, mas os caracteres de fim de linha são preservados quando uma cadeia de caracteres de várias linhas aparece como conteúdo das Label
tags or Label.Text
: