Resumo do Capítulo 2. Anatomia de um aplicativo

Baixar exemplo Baixar o exemplo

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.

Em um Xamarin.Forms aplicativo, os objetos que ocupam espaço na tela são conhecidos como elementos visuais, encapsulados pela VisualElement classe . Elementos visuais podem ser divididos em três categorias correspondentes a estas classes:

Um Page derivado ocupa toda a tela ou quase toda a tela. Geralmente, o filho de uma página é um Layout derivado para organizar elementos visuais filho. Os filhos do Layout podem ser outras Layout classes ou View derivativos (geralmente chamados de elementos), que são objetos familiares, como texto, bitmaps, controles deslizantes, botões, caixas de listagem e assim por diante.

Este capítulo demonstra como criar um aplicativo concentrando-se no Label, que é o View derivado que exibe o texto.

Diga olá

Com a plataforma Xamarin instalada, você pode criar uma nova Xamarin.Forms solução no Visual Studio ou Visual Studio para Mac. A solução Hello usa uma Biblioteca de Classes Portátil para o código comum.

Observação

Bibliotecas de classes portáteis foram substituídas por bibliotecas do .NET Standard. Todo o código de exemplo do livro foi convertido para usar bibliotecas padrão do .NET.

Este exemplo demonstra uma Xamarin.Forms solução criada no Visual Studio sem modificações. A solução consiste em quatro projetos:

  • Olá, uma PCL (Biblioteca de Classes Portátil) compartilhada pelos outros projetos
  • Hello.Droid, um projeto de aplicativo para Android
  • Hello.iOS, um projeto de aplicativo para iOS
  • Hello.UWP, um projeto de aplicativo para o Plataforma Universal do Windows (Windows 10 e Windows 10 Mobile)

Observação

Xamarin.Formsnão dá mais suporte a Windows 8.1, Windows Phone 8.1 ou Windows 10 Mobile, mas Xamarin.Forms os aplicativos são executados na área de trabalho do Windows 10.

Você pode tornar qualquer um desses projetos de aplicativo o projeto de inicialização e, em seguida, compilar e executar o programa em um dispositivo ou simulador.

Em muitos de seus Xamarin.Forms programas, você não modificará os projetos de aplicativo. Eles geralmente permanecem pequenos stubs apenas para iniciar o programa. A maior parte do foco será a biblioteca comum a todos os aplicativos.

Dentro dos arquivos

Os visuais exibidos pelo programa Hello são definidos no construtor da App classe . App deriva da Xamarin.Forms classe Application.

Observação

Os modelos de solução do Visual Studio para Xamarin.Forms criar uma página com um arquivo XAML. XAML não é abordado neste livro até o Capítulo 7.

A seção Referências do projeto Hello PCL inclui os seguintes Xamarin.Forms assemblies:

  • Xamarin.Forms. Núcleo
  • Xamarin.Forms. Xaml
  • Xamarin.Forms. Plataforma

As seções Referências dos cinco projetos de aplicativo incluem assemblies adicionais que se aplicam às plataformas individuais:

  • Xamarin.Forms. Platform.Android
  • Xamarin.Forms. Platform.iOS
  • Xamarin.Forms. Platform.UWP
  • Xamarin.Forms. Platform.WinRT
  • Xamarin.Forms. Platform.WinRT.Tablet
  • Xamarin.Forms. Platform.WinRT.Phone

Observação

As seções Referências desses projetos não listam mais os assemblies. Em vez disso, o arquivo de projeto contém marcas PackageReference referenciando o Xamarin.Forms pacote NuGet. A seção Referências no Visual Studio lista o Xamarin.Forms pacote em vez dos Xamarin.Forms assemblies.

Cada um dos projetos de aplicativo contém uma chamada para o método estático Forms.Init no Xamarin.Forms namespace . Isso inicializa a Xamarin.Forms biblioteca. Uma versão diferente de Forms.Init é definida para cada plataforma. As chamadas para esse método podem ser encontradas nas seguintes classes:

Além disso, cada plataforma deve instanciar o local da App classe na biblioteca compartilhada. Isso ocorre em uma chamada para LoadApplication nas seguintes classes:

Caso contrário, esses projetos de aplicativo são programas normais de "não fazer nada".

PCL ou SAP?

É possível criar uma Xamarin.Forms solução com o código comum em uma PCL (Biblioteca de Classes Portátil) ou um PROJETO de Ativo Compartilhado (SAP). Para criar uma solução SAP, selecione a opção Compartilhado no Visual Studio. A solução HelloSap demonstra o modelo SAP sem modificações.

Observação

Bibliotecas de classes portáteis foram substituídas por bibliotecas .NET Standard. Todo o código de exemplo do livro foi convertido para usar bibliotecas padrão do .NET. Caso contrário, as bibliotecas PCL e .NET Standard são conceitualmente muito semelhantes.

A abordagem de biblioteca agrupa todo o código comum em um projeto de biblioteca referenciado pelos projetos de aplicativo de plataforma. Com a abordagem SAP, o código comum existe efetivamente em todos os projetos de aplicativo de plataforma e é compartilhado entre eles.

A maioria dos Xamarin.Forms desenvolvedores prefere a abordagem de biblioteca. Neste livro, a maioria das soluções usa uma biblioteca. Aqueles que usam SAP incluem um sufixo Sap no nome do projeto.

Com a abordagem SAP, o código no projeto compartilhado pode executar código diferente para as várias plataformas usando diretivas de pré-processador C# (#if, #elife #endif) com esses identificadores predefinidos:

  • iOS: __IOS__
  • Android: __ANDROID__
  • UWP: WINDOWS_UWP

Em uma biblioteca compartilhada, você pode determinar em qual plataforma você está executando em runtime, como você verá mais adiante neste capítulo.

Rótulos para texto

A solução Greetings demonstra como adicionar um novo arquivo C# ao projeto Greetings . Esse arquivo define uma classe chamada GreetingsPage que deriva de ContentPage. Neste livro, a maioria dos projetos contém um único ContentPage derivado cujo nome é o nome do projeto com o sufixo Page acrescentado.

O GreetingsPage construtor cria uma instância de uma Label exibição, que é a exibição Xamarin.Forms que exibe texto. A Text propriedade é definida como o texto exibido pelo Label. Este programa define o Label como a Content propriedade de ContentPage. O construtor da App classe cria uma instância GreetingsPage e a define como sua MainPage propriedade.

O texto é exibido no canto superior esquerdo da página. No iOS, isso significa que ele se sobrepõe à barra de status da página. Há várias soluções para esse problema:

Solução 1. Incluir preenchimento na página

Defina uma Padding propriedade na página. Padding é do tipo Thickness, uma estrutura com quatro propriedades:

Padding define uma área dentro de uma página em que o conteúdo é excluído. Isso permite que o Label evite substituir a barra de status do iOS.

Solução 2. Incluir preenchimento apenas para iOS (somente SAP)

Defina uma propriedade 'Padding' somente no iOS usando um SAP com uma diretiva de pré-processador C#. Isso é demonstrado na solução GreetingsSap .

Solução 3. Incluir preenchimento apenas para iOS (PCL ou SAP)

Na versão do Xamarin.Forms usada para o livro, uma Padding propriedade específica para iOS em uma PCL ou SAP pode ser selecionada usando o Device.OnPlatform método ou Device.OnPlatform<T> estático. Esses métodos foram preteridos

Os Device.OnPlatform métodos são usados para executar código específico da plataforma ou para selecionar valores específicos da plataforma. Internamente, eles usam a Device.OS propriedade estática somente leitura, que retorna um membro da TargetPlatform enumeração :

Os Device.OnPlatform métodos, a Device.OS propriedade e a TargetPlatform enumeração agora estão preteridos. Em vez disso, use a Device.RuntimePlatform propriedade e compare o string valor retornado com os seguintes campos estáticos:

  • iOS, a cadeia de caracteres "iOS"
  • Android, a cadeia de caracteres "Android"
  • UWP, a cadeia de caracteres "UWP", referindo-se ao Plataforma Universal do Windows

A Device.Idiom propriedade estática somente leitura está relacionada. Isso retorna um membro do TargetIdiom, que tem estes membros:

Para iOS e Android, o corte entre Tablet e Phone é uma largura retrato de 600 unidades. Para a plataforma Windows, Desktop indica um aplicativo UWP em execução no Windows 10 e Phone indica um aplicativo UWP em execução no aplicativo Windows 10.

Solução 3a. Definir margem no Rótulo

A Margin propriedade foi introduzida tarde demais para ser incluída no livro, mas também é do tipo Thickness e você pode defini-la no Label para definir uma área fora da exibição incluída no cálculo do layout da exibição.

A Padding propriedade só está disponível em Layout derivativos e Page . A Margin propriedade está disponível em todos os View derivados.

Solução 4. Centralizar o rótulo dentro da página

Você pode centralizar o Label dentro do Page (ou colocá-lo em um dos outros oito locais) definindo as HorizontalOptions propriedades e VerticalOptions do Label como um valor do tipo LayoutOptions. A LayoutOptions estrutura define duas propriedades:

  • Uma Alignment propriedade do tipo LayoutAlignment, uma enumeração com quatro membros: Start, o que significa esquerda ou superior, dependendo da orientação, Center, End, que significa direita ou inferior, dependendo da orientação, e Fill.

  • Uma Expands propriedade do tipo bool.

Geralmente, essas propriedades não são usadas diretamente. Em vez disso, as combinações dessas duas propriedades são fornecidas por oito propriedades estáticas somente leitura do tipo LayoutOptions:

HorizontalOptions e VerticalOptions são as propriedades mais importantes no Xamarin.Forms layout e são discutidas mais detalhadamente no Capítulo 4. Rolando a pilha.

Aqui está o resultado com as HorizontalOptions propriedades e VerticalOptions de Label ambos definidos como LayoutOptions.Center:

Captura de tela tripla do programa de saudações

Solução 5. Centralizar o texto dentro do Rótulo

Você também pode centralizar o texto (ou colocá-lo em outros oito locais na página) definindo as HorizontalTextAlignment propriedades e VerticalTextAlignment de Label como um membro da TextAlignment enumeração:

  • Start, que significa esquerda ou superior (dependendo da orientação)
  • Center
  • End, que significa direita ou inferior (dependendo da orientação)

Essas duas propriedades são definidas apenas por Label, enquanto as HorizontalAlignment propriedades e VerticalAlignment são definidas por View e herdadas por todos os View derivativos. Os resultados visuais podem parecer semelhantes, mas são muito diferentes como demonstra o próximo capítulo.