Resumo do Capítulo 2. Anatomia de um aplicativo
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 VisualElement
pela classe. Os elementos visuais podem ser divididos em três categorias correspondentes a essas classes:
Um Page
derivado ocupa a tela inteira, ou quase toda a tela. Muitas vezes, o filho de uma página é um Layout
derivado para organizar elementos visuais filho. Os filhos do podem ser outras Layout
classes ou View
derivados (geralmente chamados de elementos), que são objetos familiares, como texto, bitmaps, controles deslizantes, botões, caixas de Layout
listagem e assim por diante.
Este capítulo demonstra como criar um aplicativo concentrando-se no Label
, que é a derivada que exibe o View
texto.
Diga olá
Com a plataforma Xamarin instalada, você pode criar uma nova Xamarin.Forms solução no Visual Studio ou no Visual Studio para Mac. A solução Hello usa uma biblioteca de classes portátil para o código comum.
Observação
As 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 biblioteca de classes portátil (PCL) 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 a Plataforma Universal do Windows (Windows 10 e Windows 10 Mobile)
Observação
Xamarin.Forms não suporta mais o 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 fazer 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 aplicativos. Estes muitas vezes permanecem pequenos esboços apenas para iniciar o programa. A maior parte do seu foco será a biblioteca comum a todos os aplicativos.
Dentro dos arquivos
Os elementos 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. O 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.FormsPlataforma.
As seções Referências dos cinco projetos de aplicativo incluem assemblies adicionais que se aplicam às plataformas individuais:
- Xamarin.Forms. Plataforma.Android
- Xamarin.Forms. Plataforma.iOS
- Xamarin.Forms. Plataforma.UWP
- Xamarin.Forms. Plataforma.WinRT
- Xamarin.Forms. Plataforma.WinRT.Tablet
- Xamarin.Forms. Plataforma.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 fazendo referência ao 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 do Forms.Init
é definida para cada plataforma. As chamadas para esse método podem ser encontradas nas seguintes classes:
- iOS:
AppDelegate
- Android:
MainActivity
- UWP:
App
classe,OnLaunched
método
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:
- iOS:
AppDelegate
- Android:
MainActivity
- UWP:
MainPage
Caso contrário, esses projetos de aplicativos 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 (Portable Class Library) ou em um SAP (Shared Asset Project). 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
As 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. 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 aplicativos da 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
, #elif
e #endif
) com estes identificadores predefinidos:
- iOS:
__IOS__
- Android:
__ANDROID__
- UWP:
WINDOWS_UWP
Em uma biblioteca compartilhada, você pode determinar em qual plataforma está sendo executada em tempo de execução, como 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
anexado.
O GreetingsPage
construtor instancia um Label
modo de exibição, que é o Xamarin.Forms modo de exibição que exibe texto. A Text
propriedade é definida como o texto exibido pelo Label
. Este programa define o Label
para a Content
propriedade de ContentPage
. O construtor da App
classe, em seguida, instancia GreetingsPage
e define para 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. Existem várias soluções para este 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 onde o conteúdo é excluído. Isso permite que o Label
para evitar 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. Inclua preenchimento apenas para iOS (PCL ou SAP)
Na versão do Xamarin.Forms usado para o livro, uma Padding
propriedade específica para iOS em uma PCL ou SAP pode ser selecionada usando o Device.OnPlatform
método estático ou Device.OnPlatform<T>
. Esses métodos agora 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 foram preteridos. Em vez disso, use a Device.RuntimePlatform
propriedade e compare o string
valor de retorno 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 à Plataforma Universal do Windows
A Device.Idiom
propriedade estática somente leitura está relacionada. Isso retorna um membro do TargetIdiom
, que tem estes membros:
Desktop
Tablet
Phone
Unsupported
está em desuso
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 para definir uma área fora da Label
exibição que está incluída no cálculo do layout da exibição.
A Padding
propriedade só está disponível em Layout
e Page
derivados. 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 dentro do Page
(ou colocá-lo em um dos oito outros lugares) definindo as HorizontalOptions
propriedades e VerticalOptions
do Label
para um valor do tipo LayoutOptions
.Label
A LayoutOptions
estrutura define duas propriedades:
Uma
Alignment
propriedade do tipoLayoutAlignment
, uma enumeração com quatro membros:Start
, que significa esquerda ou superior, dependendo da orientação,Center
,End
, que significa direita ou inferior, dependendo da orientação, eFill
.Uma
Expands
propriedade do tipobool
.
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
:
LayoutOptions.Start
LayoutOptions.Center
LayoutOptions.End
LayoutOptions.Fill
LayoutOptions.StartAndExpand
LayoutOptions.CenterAndExpand
LayoutOptions.EndAndExpand
LayoutOptions.FillAndExpand
HorizontalOptions
e VerticalOptions
são as propriedades mais importantes no Xamarin.Forms layout, e são discutidas em mais detalhes no Capítulo 4. Rolando a pilha.
Aqui está o resultado com as HorizontalOptions
propriedades e VerticalOptions
de Label
ambos definidos como LayoutOptions.Center
:
Solução 5. Centralizar o texto dentro do Rótulo
Você também pode centralizar o texto (ou colocá-lo em oito outros locais na página) definindo as HorizontalTextAlignment
propriedades e VerticalTextAlignment
de Label
para um membro da TextAlignment
enumeração:
Start
, ou seja, esquerda ou superior (dependendo da orientação)Center
End
, significando 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 todas as View
derivadas. Os resultados visuais podem parecer semelhantes, mas são muito diferentes, como o próximo capítulo demonstra.