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 se tornam elementos XML em XAML, e propriedades dessas classes e estruturas se tornam atributos XML. Para ser instanciada em XAML, uma classe geralmente deve ter um construtor sem parâmetro público. 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 para esses tipos. O analisador XAML também pode manipular facilmente tipos de enumeração e pode combinar membros de enumeração se o tipo de enumeração estiver sinalizado com o Flags
atributo.
Para auxiliar o analisador XAML, tipos mais complexos (ou propriedades desses tipos) podem incluir um que identifica uma TypeConverterAttribute
classe derivada da TypeConverter
qual oferece 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. Eles são conhecidos como elementos de objeto. A maioria das propriedades desses objetos são expressas 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 aparecer em um par de marcas 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
. Em tempo de 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 a partir do construtor do arquivo code-behind.
Durante o InitializeComponent
tempo de execução, na conclusão da chamada, todos os elementos do arquivo XAML foram instanciados e inicializados como se tivessem sido criados em 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 Xamarin.Forms elementos e a outra definindo um x
prefixo 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
arquivo . Se o XAML não for compilado, o XAML será analisado em tempo de compilação e o arquivo XAML será incorporado 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 formulário binário e o processamento em tempo de execução será mais eficiente.
Especificidade da plataforma no arquivo XAML
Em XAML, a OnPlatform
classe pode ser usada para selecionar 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 nomeadas 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
marca.
OnPlatform
é demonstrado 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 property-element não são necessárias. ContentPage
define sua propriedade content como Content
, e Layout<T>
(a classe da qual StackLayout
deriva) define sua propriedade content 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 configuração das Text
propriedades e FormattedText
do 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
marcas ou Label.Text
: