Você está na página 1de 121

Contents

Criação de aplicativos móveis com Xamarin.Forms Book


1. Como o Xamarin.Forms se encaixa?
2. Anatomia de um aplicativo
3. Aprofundamento no texto
4. Rolagem da pilha
5. Lidar com tamanhos
6. Cliques no botão
7. XAML versus código
8. Código e XAML em harmonia
9. Chamadas de API específicas à plataforma
10. Extensões de marcação XAML
11. A infraestrutura associável
12. Estilos
13. Bitmaps
14. Layout absoluto
15. A interface interativa
16. Associação de dados
17. Domínio da grade
18. MVVM
19. Exibições de coleção
20. E/S assíncrona e de arquivo
21. Transformações
22. Animação
23. Gatilhos e comportamentos
24. Navegação da página
25. Variedades de página
26. Layouts personalizados
27. Renderizadores personalizados
28. Localização e mapas
Criando aplicativos móveis com xamarin. Forms book
12/04/2019 • 10 minutes to read

baixar o exemplo
O livro criação de aplicativos móveis com xamarin. Forms , de Charles Petzold, é um guia para
aprender a escrever aplicativos xamarin. Forms. O único pré-requisito é conhecimento sobre o
C# linguagem de programação. O livro oferece uma exploração extensiva na interface do
usuário do xamarin. Forms e também aborda a animação, MVVM, gatilhos, comportamentos,
layouts personalizados, renderizadores personalizados e muito mais.
O livro foi publicado na primavera de 2016 e não tiver sido atualizado desde então. Há muito o
no livro valioso que permanece, mas alguns dos material está desatualizado, e alguns tópicos não são totalmente
correto ou foi concluído.

Baixe o livro eletrônico gratuito


Baixe o seu formato de livro eletrônico preferencial da Microsoft Virtual Academy:
PDF (56Mb)
ePub (151Mb)
Kindle edition (325Mb)
Você também pode Baixe capítulos individuais como arquivos PDF.

Exemplos
Os exemplos estão disponível no githube incluem projetos para iOS, Android e Universal Windows Platform
(UWP ). (Xamarin. Forms não é compatível com Windows 10 Mobile, mas os aplicativos xamarin. Forms serão
executado na área de trabalho do Windows 10.)

Resumos de capítulo
Resumos de capítulo estão disponíveis na tabela de capítulo mostrados abaixo. Esses resumos descrevem o
conteúdo de cada capítulo e incluem vários tipos de links:
Links para os reais capítulos do livro (na parte inferior da página) e artigos relacionados
Links para todos os exemplos de xamarin-forms-samples livro repositório do GitHub
Links para a documentação da API para obter descrições mais detalhadas de classes xamarin. Forms,
estruturas, propriedades, enumerações e assim por diante
Esses resumos também indicam quando pode ser o material no capítulo um pouco desatualizada.

Baixe capítulos e resumos


CAPÍTULO TEX TO COMPLETO RESUMO

Capítulo 1. Como o ajuste do xamarin. Baixar PDF Resumo


Forms?
CAPÍTULO TEX TO COMPLETO RESUMO

Capítulo 2. Anatomia de um aplicativo Baixar PDF Resumo

Capítulo 3. Aprofundamento no texto Baixar PDF Resumo

Capítulo 4. Rolagem da pilha Baixar PDF Resumo

Capítulo 5. Lidando com tamanhos Baixar PDF Resumo

Capítulo 6. Cliques de botão Baixar PDF Resumo

Capítulo 7. XAML vs. Código Baixar PDF Resumo

Capítulo 8. Código e XAML em Baixar PDF Resumo


harmonia

Capítulo 9. Chamadas à API específicas Baixar PDF Resumo


da plataforma

Capítulo 10. Extensões de marcação Baixar PDF Resumo


XAML

Capítulo 11. A infraestrutura associável Baixar PDF Resumo

Capítulo 12. Estilos Baixar PDF Resumo

Capítulo 13. Bitmaps Baixar PDF Resumo

Capítulo 14. Layout absoluto Baixar PDF Resumo

Capítulo 15. A Interface interativa Baixar PDF Resumo

Capítulo 16. Associação de dados Baixar PDF Resumo

Capítulo 17. Domínio da grade Baixar PDF Resumo

Capítulo 18. MVVM Baixar PDF Resumo

Capítulo 19. Exibições de coleção Baixar PDF Resumo

Capítulo 20. E/s assíncrona e de arquivo Baixar PDF Resumo

Capítulo 21. Transformações Baixar PDF Resumo

Capítulo 22. Animação Baixar PDF Resumo

Capítulo 23. Gatilhos e Baixar PDF Resumo


comportamentos

Capítulo 24. Navegação de página Baixar PDF Resumo

Capítulo 25. Variedades de página Baixar PDF Resumo


CAPÍTULO TEX TO COMPLETO RESUMO

Capítulo 26. Layouts personalizados Baixar PDF Resumo

Capítulo 27. Renderizadores Baixar PDF Resumo


personalizados

Capítulo 28. Localização e mapas Baixar PDF Resumo

Maneiras em que o livro está desatualizado


Desde a publicação da criação de aplicativos móveis com xamarin. Forms, vários recursos novos foram
adicionados ao xamarin. Forms. Esses novos recursos são descritos nos artigos individuais a xamarin. Forms
documentação.
Outras alterações fizeram parte do conteúdo do livro fiquem desatualizados:
Bibliotecas do .NET standard 2.0 substituíram as bibliotecas de classes portáteis
Em geral, um aplicativo xamarin. Forms usa uma biblioteca para compartilhar código entre diferentes plataformas.
Originalmente, essa foi uma biblioteca de classe portátil (PCL ). Há muitas referências a PCLs em todo o catálogo e
os resumos de capítulo.
Biblioteca de classes portátil foi substituída por uma biblioteca .NET Standard 2.0, conforme descrito no artigo
suporte no xamarin. Forms do .NET Standard 2.0. Todos os código de exemplo do livro foi atualizado para usar
bibliotecas .NET Standard 2.0.
A maioria das informações no livro sobre a função de biblioteca de classes portátil permanece o mesmo para uma
biblioteca .NET Standard 2.0. Uma diferença é que apenas uma PCL tem um numérico "perfil". Além disso, há
algumas vantagens em bibliotecas do .NET Standard 2.0. Por exemplo, o capítulo 20 Async e/s de arquivo descreve
como usar as plataformas subjacentes para executar e/s de arquivo. Isso não é mais necessário. A biblioteca do
.NET Standard 2.0 oferece suporte a familiar System.IO classes para todas as plataformas do xamarin. Forms.
A biblioteca .NET Standard 2.0 também permite que os aplicativos xamarin. Forms usar HttpClient para acessar
os arquivos pela Internet em vez de WebRequest ou outras classes.
A função do XAML foi promovida
Criando aplicativos móveis com xamarin. Forms começa descrevendo como escrever aplicativos xamarin. Forms
usando a linguagem c#. O de Extensible Application Markup Language (XAML ) não é introduzido até capítulo 7.
XAML vs. Código.
Agora, a XAML tem um papel muito maior no xamarin. Forms. Os modelos de solução do xamarin. Forms
distribuídos com o Visual Studio criam arquivos de página baseados em XAML. Um desenvolvedor usando o
xamarin. Forms deve se familiarizar com o XAML mais cedo possível. O linguagem de marcação de aplicativo
extensível (XAML ) seção da documentação do xamarin. Forms contém vários artigos sobre XAML para você
começar.
Plataformas com suporte
Xamarin. Forms não oferece mais suporte do Windows 8.1 e Windows Phone 8.1.
O livro, às vezes, faz referência à tempo de execução do Windows. Esse é um termo que abrange a API do
Windows usada em várias versões do Windows e Windows Phone. As versões mais recentes do xamarin. Forms
restringe-se para dar suporte a plataforma Universal do Windows, que é a API para o Windows 10 e Windows 10
Mobile.
Uma biblioteca .NET Standard 2.0 não oferece suporte a qualquer versão do Windows 10 Mobile. Portanto, um
aplicativo xamarin. Forms usando uma biblioteca .NET Standard não será executado em um dispositivo Windows
10 Mobile. Aplicativos de xamarin. Forms continuarão sendo executados no Windows 10 desktop, versões
10.0.16299.0 e acima.
Xamarin. Forms tem suporte de visualização para o Mac, WPF, GTK #, e Tizen plataformas.
Resumos de capítulo
Os resumos de capítulo incluem as informações relacionadas a alterações no xamarin. Forms, pois o livro foi
escrito. Eles costumam ser na forma de anotações:

NOTE
Observações sobre cada página indicam onde o xamarin. Forms foi bifurcado do material apresentado no livro.

Exemplos
No xamarin-forms-samples livro repositório do GitHub, o código original do livro branch contém exemplos
de programa consistentes com o catálogo. O mestre branch contém projetos que foram atualizados para remover
APIs preteridas e refletir APIs aprimoradas. Além disso, o Android projetos na mestre branch foram atualizados
para o Android Design de Material via AppCompat e geralmente exibirá texto preto em um plano de fundo branco.

Links relacionados
Blog do MS Press
Código de exemplo do livro
Resumo do capítulo 1. Como xamarin. Forms se
encaixa?
12/04/2019 • 10 minutes to read

baixar o exemplo

NOTE
Observações sobre essa página indicam áreas onde o xamarin. Forms foi bifurcado do material apresentado no livro.

Um dos trabalhos mais desagradáveis na programação é portar um código de base de uma plataforma para outra,
especialmente se essa plataforma envolve uma linguagem de programação diferente. Há uma tentação ao portar o
código para refatorá-lo bem, mas se ambas as plataformas devem ser mantidas em paralelo, em seguida, as
diferenças entre as duas bases de código dificultará manutenção futura.

Desenvolvimento móvel multiplataforma


Esse problema é comum ao direcionar para plataformas móveis. Atualmente, existem duas principais plataformas
móveis, a família de Apple de iPhones e iPads que executam o sistema operacional iOS e o sistema operacional
Android que é executado em uma variedade de telefones e tablets. Outra plataforma significativa é Universal
Windows Platform (UWP da Microsoft), que permite que um único programa para ambos os Windows 10 de
destino.
Um fornecedor de software que deseja essas plataformas de destino deve lidar com paradigmas de interface de
usuário diferente, três ambientes de desenvolvimento diferente, três interfaces de programação diferente, e—talvez
mais incômoda—três linguagens de programação diferentes: Objective-C para iPhone e iPad, Java para Android, e
C# para Windows.

A solução c# e .NET
Embora Objective-C, Java e c# são derivados da linguagem de programação C, eles foram desenvolvidos por
caminhos muito diferentes. C# é a mais recente dessas linguagens e tem sido amadurecimento de maneiras muito
útil. Além disso, o c# é estreitamente relacionados com uma infra-estrutura de programação toda chamada .NET,
que fornece suporte para matemática, depuração, reflexão, coleções, globalização, e/s de arquivo, rede, segurança,
threading, serviços web, manipulação de dados e XML e JSON de leitura e gravação.
Atualmente, Xamarin fornece ferramentas para direcionar o Mac, iOS e APIs do Android usando c# e .NET native.
Essas ferramentas são chamadas de xamarin. Mac, xamarin. IOS e xamarin. Android, coletivamente conhecido
como a plataforma Xamarin. Essas são as bibliotecas e as ligações que expressam as APIs nativas dessas
plataformas com linguagens .NET.
Os desenvolvedores podem usar a plataforma Xamarin para escrever aplicativos em c# destinados ao Mac, iOS ou
Android. Mas quando mais de uma plataforma de direcionamento, faz muito sentido para compartilhar parte do
código entre as plataformas de destino. Isso envolve a separação de programa em código dependente de
plataforma (geralmente envolvendo a interface do usuário) e o código independente de plataforma, o que
geralmente requer apenas o base do .NET framework. Esse código independente de plataforma ou pode residir em
uma biblioteca de classe portátil (PCL ) ou um projeto compartilhado, geralmente chamado de um projeto de ativo
compartilhado ou SAP.
NOTE
Bibliotecas de classes portáteis foram substituídas por bibliotecas .NET Standard. O código de exemplo do livro foi convertido
para usar bibliotecas padrão do .NET.

Introdução ao xamarin. Forms


Ao direcionar várias plataformas móveis, xamarin. Forms permite o compartilhamento de código ainda mais. Um
único programa escrito para o xamarin. Forms podem direcionar essas plataformas:
iOS para programas que são executados no iPhone, iPad e iPod touch
Android para programas que são executados em telefones e tablets Android
a plataforma Universal do Windows para o destino do Windows 10

NOTE
Xamarin. Forms não oferece suporte a Windows 8.1, Windows Phone 8.1 ou Windows 10 Mobile, mas os aplicativos xamarin.
Forms são executados no Windows 10 desktop. Também há suporte para visualização os Mac, WPF, GTK #, e Tizen
plataformas.

A maior parte de um programa do xamarin. Forms existe em uma biblioteca ou um SAP. Cada uma das
plataformas consiste em um stub de aplicativo pequeno que chama esse código compartilhado.
As APIs Xamarin.Forms mapeados para controles nativos em cada plataforma, para que cada plataforma mantém
sua aparência característica:

As capturas de tela da esquerda para direita mostram um iPhone e um telefone Android:


Em cada tela, a página contém um xamarin. Forms Label para exibir o texto, uma Button para iniciar ações, uma
Switch para Escolhendo um valor de ativar/desativar e um Slider para especificar um valor dentro de um
intervalo contínuo. Todos os quatro essas exibições são filhos de um StackLayout em uma ContentPage .
Também é anexado à página é uma barra de ferramentas do xamarin. Forms que consiste em vários ToolbarItem
objetos. Eles são visíveis como ícones na parte superior do iOS e Android telas e, na parte inferior da tela do
Windows 10 Mobile.
Xamarin. Forms também oferece suporte a XAML, a Extensible Application Markup Language de desenvolvidos na
Microsoft para várias plataformas de aplicativo. Todos os visuais do programa mostrado acima são definidos em
XAML, conforme demonstrado a PlatformVisuals exemplo.
Um programa de xamarin. Forms pode determinar em qual plataforma na qual está sendo executado e executar
um código diferente de acordo. Mais potente, os desenvolvedores podem escrever código personalizado para
várias plataformas e executar esse código a partir de um programa do xamarin. Forms de maneira independente
de plataforma. Os desenvolvedores também podem criar controles adicionais escrevendo renderizadores para
cada plataforma.
Enquanto o xamarin. Forms é uma boa solução para aplicativos de linha de negócios ou para criação de protótipos,
ou fazer uma rápida demonstração de prova de conceito, é menos ideal para aplicativos que requerem interação
por toque complexos ou gráficos vetoriais.

Ambiente de desenvolvimento
Ambiente de desenvolvimento depende de quais plataformas de destino e quais computadores você deseja usar.
Se você desejar direcionar ao iOS, você precisará de um Mac com Xcode e a plataforma Xamarin instalados.
Suporte a Android também exige a instalação do Java e os SDKs necessários. Você pode, em seguida, direcionar o
iOS e Android usando o Visual Studio para Mac.
Instalar o Visual Studio permite no PC de destino todas as plataformas Windows, Android e iOS. No entanto,
direcionamento ao iOS no Visual Studio ainda requer um Mac com Xcode e a plataforma Xamarin instalados.
Você pode testar os programas em um dispositivo real conectado por USB ao computador ou em um simulador.

Instalação
Antes de criar e compilar um aplicativo xamarin. Forms, você deve tentar criar e compilar separadamente de um
aplicativo iOS, um aplicativo do Android e um aplicativo UWP, dependendo das plataformas que deseja para seu
ambiente de desenvolvimento e de destino.
Os sites Xamarin e da Microsoft contêm informações sobre como fazer isso:
Introdução ao iOS
Introdução ao Android
Centro de Desenvolvedores do Windows
Depois que você pode criar e executar projetos para essas plataformas individuais, você deve enfrentar nenhum
problema criando e executando um aplicativo xamarin. Forms.

Links relacionados
Capítulo 1 de texto completo (PDF )
Exemplo de capítulo 1
Resumo do capítulo 2. Anatomia de um aplicativo
12/04/2019 • 15 minutes to read

baixar o exemplo

NOTE
Observações sobre essa página indicam áreas onde o xamarin. Forms foi bifurcado do material apresentado no livro.

Em um aplicativo xamarin. Forms, os objetos que ocupam espaço na tela são conhecidos como elementos visuais,
encapsulado pelo VisualElement classe. Elementos visuais podem ser divididos em três categorias
correspondentes a essas classes:
Página
Layout
Exibir
Um Page derivativo ocupa a tela inteira ou quase toda a tela. Muitas vezes, o filho de uma página é um Layout
derivativo para organizar os elementos visuais do filho. Os filhos do Layout pode ser outra Layout classes ou
View derivados (geralmente chamado 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 se concentrando na Label , que é o View derivativo que exibe
texto.

Diga Olá
Com a plataforma Xamarin instalado, você pode criar uma nova solução xamarin. Forms no Visual Studio ou
Visual Studio para Mac. O Hello solução usa uma biblioteca de classes portátil para o código comum.

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

Este exemplo demonstra uma solução xamarin. Forms criada no Visual Studio sem modificações. A solução
consiste em seis projetos:
Hello, uma biblioteca de classe portátil (PCL ) compartilhado por 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)
Hello.Windows, um projeto de aplicativo para Windows 8.1
Hello.WinPhone, um projeto de aplicativo para Windows Phone 8.1
NOTE
Xamarin. Forms não oferece suporte a Windows 8.1, Windows Phone 8.1 ou Windows 10 Mobile, mas os aplicativos xamarin.
Forms são executados no Windows 10 desktop.

Você pode tornar o projeto de inicialização, a qualquer um desses projetos de aplicativo e, em seguida, compilar e
executar o programa em um dispositivo ou simulador.
Em muitos dos seus programas do xamarin. Forms, você não modificar os projetos de aplicativo. Eles geralmente
permanecem stubs pequenas apenas para iniciar o programa. A maioria de seu foco será a biblioteca comum para
todos os aplicativos.

Dentro dos arquivos


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

NOTE
Os modelos de solução do Visual Studio para xamarin. Forms criam uma página com um arquivo XAML. XAML não é
abordada neste livro até capítulo 7.

O referências seção o Hello projeto PCL inclui os seguintes assemblies do xamarin. Forms:
Xamarin.Forms.Core
Xamarin.Forms.Xaml
Xamarin.Forms.Platform
O referências seções dos projetos de cinco 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

NOTE
O referências seções desses projetos não listam os assemblies. Em vez disso, o arquivo de projeto contém um
PackageReference marcas referenciando o pacote do NuGet xamarin. Forms. O referências seção em listas do Visual
Studio a xamarin. Forms do pacote em vez dos assemblies do xamarin. Forms.

Cada um dos projetos de aplicativo contém uma chamada para estático Forms.Init método no Xamarin.Forms
namespace. Isso inicializa a biblioteca xamarin. Forms. 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 a App classe local 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 aplicativo são programas de "não fazer nada" normal.

PCL ou SAP?
É possível criar uma solução xamarin. Forms com o código comum em uma biblioteca de classe portátil (PCL ) ou
um projeto de ativo compartilhado (SAP ). Para criar uma solução do SAP, selecione a opção de Shared no Visual
Studio. O HelloSap solução demonstra o modelo SAP sem modificações.

NOTE
Bibliotecas de classes portáteis foi substituída por bibliotecas .NET Standard. 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.

Os pacotes de abordagem de biblioteca todas as comuns de código em um projeto de biblioteca referenciado


pelos projetos de aplicativo de plataforma. Com a abordagem do SAP, o código comum efetivamente existe em
todos os projetos de aplicativo de plataforma e é compartilhado entre elas.
A maioria dos desenvolvedores de xamarin. Forms prefiro a abordagem de biblioteca. Neste livro, a maioria das
soluções de usa uma biblioteca. Aqueles que usam SAP incluem uma Sap sufixo no nome do projeto.
Com a abordagem do SAP o código no projeto compartilhado pode executar código diferente para várias
plataformas usando C# diretivas de pré-processador ( #if , # elif , e #endif ) com esses predefinido
identificadores:
iOS: __IOS__
Android: __ANDROID__
UWP: WINDOWS_UWP
Em uma biblioteca compartilhada, você pode determinar qual plataforma você está executando em tempo de
execução, como você verá neste capítulo.

Rótulos de texto
O saudações solução demonstra como adicionar um novo C# do arquivo para o saudações projeto. Esse arquivo
define uma classe chamada GreetingsPage que deriva de ContentPage . Neste livro, a maioria dos projetos contêm
uma única ContentPage derivativo cujo nome é o nome do projeto com o sufixo Page acrescentado.
O GreetingsPage construtor instancia uma Label exibição, que é o modo de exibição do xamarin. Forms que exibe
texto. O Text estiver definida como o texto exibido pelo Label . Este programa define a Label para o Content
propriedade de ContentPage . O construtor do App , em seguida, cria uma instância de classe GreetingsPage e o
configura para seu MainPage propriedade.
O texto é exibido no canto superior esquerdo da página. No iOS, isso significa que ele se sobrepõe a barra de
status da página. Há várias soluções para esse problema:
Solução 1. Incluir o preenchimento da página
Definir um Padding propriedade na página. Padding é do tipo Thickness , uma estrutura com quatro
propriedades:
Left
Top
Right
Bottom

Padding define uma área dentro de uma página em que o conteúdo é excluído. Isso permite que o Label para
evitar a substituição da barra de status do iOS.
Solução 2. Incluir o preenchimento apenas para iOS (SAP)
Definir uma propriedade de 'Enchimento' apenas no iOS usando um SAP com uma C# diretiva de pré-
processador. Isso é demonstrado na GreetingsSap solução.
Solução 3. Incluir o preenchimento apenas para iOS (PCL ou SAP)
Na versão do xamarin. Forms usado para o catálogo, um Padding propriedade específica do iOS em um PCL ou
SAP pode ser selecionada usando o Device.OnPlatform ou Device.OnPlatform<T> método estático. Esses métodos
agora são preteridos.
O Device.OnPlatform métodos são usados para executar o código específico da plataforma ou para selecionar
valores específicos de plataforma. Internamente, eles fazem uso do Device.OS propriedade somente leitura
estática, que retorna um membro dos TargetPlatform enumeração:
iOS
Android
Windows para dispositivos UWP.

O Device.OnPlatform métodos, o Device.OS propriedade e o TargetPlatform enumeração são todos preterido. Em


vez disso, use o Device.RuntimePlatform propriedade e comparar o string retornar valor 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

O Device.Idiom está relacionada a propriedade estática de somente leitura. Isso retorna um membro de
TargetIdiom , que tem estes membros:
Desktop
Tablet
Phone
Unsupported não é usado

Para iOS e Android, o corte entre Tablet e Phone é uma largura de retrato de unidades de 600. 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 do Windows 10.

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


O Margin propriedade foi introduzida tarde demais para serem incluídos no catálogo, mas também é do tipo
Thickness e você pode defini-lo no Label para definir uma área fora do modo de exibição que está incluído no
cálculo das layout do modo de exibição.
O Padding propriedade só está disponível no Layout e Page derivados. O Margin propriedade está disponível
em todos os View derivados.

Solução 4. O rótulo dentro da página do Centro


Você pode centralizar o Label dentro de Page (ou coloque-o em um dos oito outros lugares) definindo o
HorizontalOptions e VerticalOptions propriedades do Label para um valor do tipo LayoutOptions . O
LayoutOptions estrutura define duas propriedades:

Uma Alignment propriedade do tipo LayoutAlignment , uma enumeração com quatro membros: Start ,
que significa esquerda ou superior, dependendo do orientação Center , End , que significa que a parte
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, combinações dessas duas
propriedades são fornecidas por oito propriedades de somente leitura estáticas 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 layout do xamarin. Forms e são
discutidos em mais detalhes capítulo 4. Rolagem da pilha.
Aqui está o resultado com o HorizontalOptions e VerticalOptions propriedades de Label definidos como
LayoutOptions.Center :

Solução 5. Centralizar o texto no rótulo


Você pode centralizar o texto (ou coloque-o em oito outros locais na página), definindo a HorizontalTextAlignment
e VerticalTextAlignment propriedades de Label a um membro da TextAlignment enumeração:
Start , significado esquerda ou superior (dependendo da orientação)
Center
End , que significa que a parte direita ou inferior (dependendo da orientação)

Essas duas propriedades são definidas somente pelo Label , enquanto a HorizontalAlignment e
VerticalAlignment propriedades são definidas pelos View e herdada por todas as View derivados. Os resultados
visuais podem parecer semelhantes, mas eles são muito diferentes, como demonstra o capítulo seguinte.

Links relacionados
Capítulo 2 de texto completo (PDF )
Exemplos do capítulo 2
Capítulo 2 F# amostras
Introdução ao xamarin. Forms
Resumo do capítulo 3. Aprofundamento no texto
12/04/2019 • 12 minutes to read

baixar o exemplo
Este capítulo explora a Label exibir mais detalhes, incluindo cores, fontes e formatação.

Quebra automática de parágrafos


Quando o Text propriedade do Label contém texto longo, Label automaticamente quebra em várias linhas
como demonstrado pelo Baskervilles exemplo. Você pode inserir códigos de Unicode como \u2014 para em-
dash, ou C# caracteres, como '\r' quebrar para uma nova linha.
Quando o HorizontalOptions e VerticalOptions propriedades de um Label são definidos como
LayoutOptions.Fill , o tamanho geral do Label é regido pelo espaço de que seu contêiner disponibiliza. O Label
será considerada restrita. O tamanho do Label é o tamanho de seu contêiner.
Quando o HorizontalOptions e VerticalOptions propriedades são definidas como valores diferente de
LayoutOptions.Fill , o tamanho da Label é regido pelo espaço necessário para renderizar o texto, até o tamanho
que seu contêiner torna disponível para o Label . O Label será considerada irrestrita e determina seu próprio
tamanho.
(Observação: Os termos restrita e irrestrita pode ser contraintuitivo, porque uma exibição irrestrita é geralmente
menor do que uma exibição restrita. Além disso, esses termos não são usados consistentemente nos primeiros
capítulos do livro.)
Um modo de exibição, como um Label pode ser restrito em uma dimensão e sem restrições no outro. Um Label
só será quebrar o texto em várias linhas se ele for restrita horizontalmente.
Se um Label é restrito, ele pode ocupar espaço consideravelmente mais que o necessário para o texto. O texto
pode ser posicionado dentro da área geral do Label . Defina as HorizontalTextAlignment propriedade a um
membro da TextAlignment enumeração ( Start , Center , ou End ) para controlar o alinhamento de todas as
linhas do parágrafo. O padrão é Start e alinha o texto à esquerda.
Defina a VerticalTextAlignment propriedade a um membro da TextAlignment enumeração para posicionar o texto
na parte superior, central ou parte inferior da área ocupada pelo Label .
Defina as LineBreakMode propriedade a um membro da LineBreakMode enumeração ( WordWrap , CharacterWrap ,
NoWrap , HeadTruncation , MiddleTruncation , ou TailTruncation ) para controle como as várias linhas de uma
quebra de parágrafo ou são truncados.

Cores de plano de fundo e texto


Defina as TextColor e BackgroundColor propriedades do Label para Color valores para controlar a cor do plano
de fundo e texto.
O BackgroundColor aplica-se ao plano de fundo de toda a área ocupada pelo Label . Dependendo de
HorizontalOptions e VerticalOptions propriedades, que o tamanho pode ser consideravelmente maior do que a
área necessária para exibir o texto. Você pode usar cor para fazer experiências com vários valores de
HorizontalOptions , VerticalOptions , HorizontalExeAlignment , e VerticalTextAlignment para ver como elas afetam
o tamanho e posição do Label e o tamanho e a posição do texto dentro de Label .
A estrutura de cor
O Color estrutura permite que você especificar cores como valores de vermelho-verde-azul (RGB ) ou valores de
matiz-saturação-luminosidade HSL (), ou com um nome de cor. Um canal alfa também está disponível para indicar
a transparência.
Use um Color construtor para especificar:
um tonalidade de cinza
um valor RGB
um valor RGB com transparência
Os argumentos são double valores que variam de 0 a 1.
Você também pode usar vários métodos estáticos para criar Color valores:
Color.FromRgb para double valores RGB de 0 a 1
Color.FromRgb para valores RGB de inteiro de 0 a 255
Color.FromRgba para double valores RGB com transparência
Color.FromRgba para valores RGB de inteiros com transparência
Color.FromHsla para double valores HSL com transparência
Color.FromUint para um uint valor calculado como ( B + 256 * ( G + 256 * ( R + 256 * um )))
Color.FromHex para um string formato de dígitos hexadecimais no formulário "#AARRGGBB" ou
"#RRGGBB" ou "#ARGB" ou "#RGB", em que cada letra corresponde a um dígito hexadecimal para alfa,
vermelho, verdes e azuis de canais. Esse método é primário usado para conversões de cor do XAML, conforme
discutido em capítulo 7, o XAML versus código.
Depois de criada, um Color valor é imutável. As características da cor podem ser obtidas as seguintes
propriedades:
R
G
B
A
Hue
Saturation
Luminosity

Estas são todas as double valores que variam de 0 a 1.


Color também define 240 campos estáticos públicos somente leitura para cores comuns. No momento em que o
livro foi escrito, estavam disponíveis somente 17 cores comuns.
Outro campo estático público somente leitura define uma cor com todos os canais de cores definidos como zero:
Color.Transparent

Vários métodos de instância permitem a modificação de uma cor existente para criar uma nova cor:
AddLuminosity
MultiplyAlpha
WithHue
WithLuminosity
WithSaturation
Por fim, duas propriedades somente leitura estáticas definem valor de cor especial:
Color.Default , todos os canais definido como –1
Color.Accent

Color.Default destina-se para impor o esquema de cores da plataforma e, consequentemente, tem um significado
diferente em contextos diferentes em diferentes plataformas. Por padrão, os esquemas de cores de plataforma são:
iOS: Texto escuro no plano de fundo claro
Android: Texto em um plano de fundo escuro (no livro) ou texto escuro no plano de fundo claro de luz (para o
Design de Material via AppCompat na mestre branch do repositório de código de exemplo)
UWP: Texto escuro no plano de fundo claro
O Color.Accent valor resulta em uma cor específica da plataforma (e, às vezes, selecionável pelo usuário) que é
visível em um fundo claro ou escuro.

Alterando o esquema de cores do aplicativo


Várias plataformas têm um esquema de cores padrão, conforme mostrado na lista acima.
Ao direcionar o Android, é possível alternar para um esquema de escuro na luz, especificando um tema claro no
arquivo Android.Manifest.xml ou pelo adicionando AppCompat e Design de Material.
Para as plataformas Windows, o tema de cores é normalmente selecionado pelo usuário, mas você pode adicionar
um RequestedTheme atributo definido como Light ou Dark no arquivo App. XAML da plataforma. Por padrão, o
arquivo App. XAML no projeto UWP contém um RequestedTheme atributo definido como Light .

Atributos e tamanhos de fonte


Defina as FontFamily propriedade do Label para uma cadeia de caracteres como "Times Roman" para selecionar
uma família de fontes. No entanto, você precisa especificar uma família de fontes com suporte na plataforma
específica e as plataformas são inconsistentes em relação a isso.
Defina as FontSize propriedade do Label para um double para especificar a altura aproximada da fonte. Ver
capítulo 5, lidar com tamanhos, para obter mais detalhes sobre como escolher com inteligência de tamanhos de
fonte.
Como alternativa, você pode obter um dos vários tamanhos de fonte de predefinição dependente de plataforma.
Estático Device.GetNamedSize método e sobrecarregar retornam uma double valor de tamanho de fonte
apropriado para a plataforma com base nos membros do NamedSize enumeração ( Default , Micro , Small ,
Medium , e Large ). O valor retornado de Medium membro não é necessariamente o mesmo que Default . O
NamedFontSizes exemplo exibe texto com esses tamanhos de nomeados.
Defina as FontAttributes propriedade do Label a um membro desses FontAttributes enumeração, Bold ,
Italic , ou None . Você pode combinar as Bold e Italic membros com o C# operador OR de bit a bit.

Texto formatado
Em todos os exemplos até agora, todo o texto exibido pelo Label tiverem sido formatados de maneira uniforme.
Para variar a formatação dentro de uma cadeia de caracteres de texto, não defina a Text propriedade de Label .
Em vez disso, defina as FormattedText propriedade para um objeto do tipo FormattedString .
FormattedString tem um Spans propriedade que é uma coleção de Span objetos. Cada Span objeto tem seu
próprio Text , FontFamily , FontSize , FontAttributes , ForegroundColor , e BackgroundColor propriedades.
O VariableFormattedText exemplo demonstra como usar o FormattedText propriedade para uma única linha de
texto, e VariableFormattedParagraph demonstra a técnica para um parágrafo inteiro, como mostrado aqui:

O NamedFontSizes programa usa um único Label e um FormattedString objeto para exibir todos os tamanhos
de fonte nomeada para cada plataforma.

Links relacionados
Capítulo 3 de texto completo (PDF )
Exemplos do capítulo 3
Capítulo 3 F# amostras
Rótulo
Trabalhar com cores
Resumo do capítulo 4. Rolagem da pilha
12/04/2019 • 11 minutes to read

baixar o exemplo
Este capítulo dedica-se principalmente para introduzir o conceito de layout, que é o termo geral para as classes e
as técnicas que usa o xamarin. Forms para organizar a exibição visual de vários modos de exibição na página.
Layout envolve várias classes que derivam de Layout e Layout<T> . Este capítulo enfoca StackLayout .

NOTE
O FlexLayout introduzido no xamarin. Forms 3.0 pode ser usado de maneiras semelhantes a StackLayout , mas com
mais flexibilidade.

Também é apresentado neste capítulo são as ScrollView , Frame ,e BoxView classes.

Pilhas de modos de exibição


StackLayout deriva Layout<View> e herda um Children propriedade do tipo IList<View> . Adicionar vários itens
de exibição para essa coleção, e StackLayout exibe-os em uma pilha horizontal ou vertical.
Defina a Orientation propriedade do StackLayout a um membro da StackOrientation enumeração, qualquer um
dos Vertical ou Horizontal . O padrão é Vertical .
Defina as Spacing propriedade do StackLayout para um double valor para especificar um espaçamento entre os
filhos. O valor padrão é 6.
No código, você pode adicionar itens a serem a Children coleção de StackLayout em um for ou foreach loop
conforme demonstrado no ColorLoop exemplo, ou você pode inicializar o Children coleção com uma lista das
exibições individuais conforme demonstrado no ColorList. Os filhos devem derivar View , mas pode incluir
outros StackLayout objetos.

Rolando conteúdo
Se um StackLayout contém muitos filhos serem exibidos em uma página, você pode colocar o StackLayout em
um ScrollView para permitir a rolagem.
Defina as propriedade do ScrollView para o modo de exibição para rolar. Isso geralmente é um
Content
StackLayout , mas pode ser qualquer modo de exibição.

Defina a propriedade do ScrollView a um membro da


Orientation ScrollOrientation propriedade, Vertical ,
Horizontal , ou Both . O padrão é Vertical . Se o conteúdo de um ScrollView é um StackLayout , as duas
orientações devem ser consistentes.
O ReflectedColors exemplo demonstra o uso de ScrollView e StackLayout para exibir as cores disponíveis. O
exemplo também demonstra como usar a reflexão do .NET para obter todos os campos de e as propriedades
públicas estáticas a Color estrutura sem a necessidade de listá-los explicitamente.

A opção expande
Quando um pilhas de seus filhos, cada filho ocupa um slot específico dentro a altura total do
StackLayout
StackLayout que depende do tamanho de seu filho e as configurações de seu HorizontalOptions e
VerticalOptions propriedades. Essas propriedades são atribuídas valores do tipo LayoutOptions .

O LayoutOptions estrutura define duas propriedades:


Alignment o tipo de enumeração LayoutAlignment com quatro membros, Start , Center , End ,e Fill
Expands do tipo bool
Para sua conveniência, o LayoutOptions estrutura também define oito campos estáticos somente leitura do tipo
LayoutOptions que abrangem todas as combinações das propriedades de dois instância:

LayoutOptions.Start
LayoutOptions.Center
LayoutOptions.End
LayoutOptions.Fill
LayoutOptions.StartAndExpand
LayoutOptions.CenterAndExpand
LayoutOptions.EndAndExpand
LayoutOptions.FillAndExpand

A discussão a seguir envolve uma StackLayout com uma orientação vertical do padrão. Horizontal StackLayout é
análogo.
Para vertical StackLayout , o HorizontalOptions configuração determina como o filho é posicionado
horizontalmente dentro da largura do StackLayout . Uma Alignment configuração do Start , Center , ou End faz
com que o filho seja horizontalmente irrestrita. O filho determina sua própria largura e é posicionado na esquerda,
centro ou direita do StackLayout . O Fill opção faz com que o filho a ser restringido horizontalmente e preenche
a largura do StackLayout .
Para vertical StackLayout , cada filho é irrestrito verticalmente e obtém uma vertical slot dependendo da altura de
seu filho, caso em que o VerticalOptions configuração é irrelevante.
Se vertical StackLayout em si é irrestrita—que é se seu VerticalOptions configuração é Start , Center , ou End ,
em seguida, a altura do StackLayout é a altura total de seus filhos.
No entanto, se a vertical StackLayout verticalmente é restrito—se seu VerticalOptions configuração é Fill —,
em seguida, a altura do StackLayout será a altura de seu contêiner, que pode ser maior que o total altura de seus
filhos. Se esse for o caso e se tem pelo menos um filho uma VerticalOptions com um Expands do sinalizador de
true , em seguida, o espaço extra no StackLayout é alocado igualmente entre todos os filhos com um Expands do
sinalizador de true . A altura total dos filhos, em seguida, será igual a altura do StackLayout e o Alignment fazem
parte do VerticalOptions configuração determina como o filho é posicionado verticalmente em seu slot.
Isso é demonstrado na VerticalOptionsDemo exemplo.

Quadro e BoxView
Esses dois modos de exibição retangulares geralmente são usados para fins de apresentação.
O Frame modo de exibição exibe um quadro retangular em torno de outro modo de exibição, que pode ser um
layout, como StackLayout . Frame herda um Content propriedade do ContentView que você definir para o modo
de exibição a ser exibido dentro de Frame . O Frame é transparente por padrão. Defina as seguintes três
propriedades para personalizar a aparência do quadro:
O OutlineColor propriedade para torná-la visível. É comum para definir OutlineColor para Color.Accent
quando você não souber o esquema de cores subjacente.
O HasShadow propriedade pode ser definida como true para exibir uma sombra preta em dispositivos iOS.
Defina a Padding propriedade para um Thickness conteúdo do valor deixar um espaço entre o quadro e
quadro. O valor padrão é de 20 unidades de todos os lados.
O Frame possui padrão HorizontalOptions e VerticalOptions valores de LayoutOptions.Fill , o que significa que
o Frame será preencher seu contêiner. Com outras configurações, o tamanho do Frame baseia-se no tamanho do
seu conteúdo.
O Frame é demonstrado na FramedText exemplo.
O BoxView exibe uma área retangular da cor especificada pelo seu Color propriedade.
Se o BoxView é restrito (sua HorizontalOptions e VerticalOptions propriedades têm suas configurações padrão
de LayoutOptions.Fill ), o BoxView preenche o espaço disponível para ele. Se o BoxView irrestrita (com
HorizontalOptions e LayoutOptions configurações de Start , Center , ou End ), ele tem uma dimensão padrão do
quadrado de 40 unidades. Um BoxView pode ser restrito em uma dimensão e sem restrições no outro.
Muitas vezes, você definirá a WidthRequest e HeightRequest propriedades de BoxView para dar a ele um tamanho
específico. Isso é ilustrado pelo SizedBoxView exemplo.
Você pode usar várias instâncias do StackLayout para combinar uma BoxView e várias Label instâncias em um
Frame para exibir uma cor específica e, em seguida, colocar cada um desses modos de exibição em um
StackLayout em um ScrollView para criar o atraente lista de cores mostrada a ColorBlocks exemplo:

Um ScrollView em um StackLayout?
Colocando um StackLayout em um ScrollView é comum, mas colocando um ScrollView em um StackLayout ,
às vezes, também é conveniente. Em teoria, isso não deve ser possível porque os filhos de um vertical
StackLayout são verticalmente irrestrita. Mas um ScrollView deve ser restrito verticalmente. Ele deve receber
uma altura específica para que, em seguida, ele pode determinar o tamanho de seu filho para rolagem.
O truque é dar a ScrollView filho do StackLayout um VerticalOptions configuração de FillAndExpand . Isso é
demonstrado na BlackCat exemplo.
O BlackCat exemplo também demonstra como definir e acessar os recursos do programa que são inseridos na
biblioteca compartilhada. Isso também pode ser obtido com projetos de ativos compartilhados (SAPs), mas o
processo é um pouco mais complicado, como o BlackCatSap demonstra.
Links relacionados
Capítulo 4 de texto completo (PDF )
Exemplos do capítulo 4
Capítulo 4 F# amostras
StackLayout
ScrollView
BoxView
Resumo do capítulo 5. Lidando com tamanhos
12/04/2019 • 7 minutes to read

baixar o exemplo

NOTE
Observações sobre essa página indicam áreas onde o xamarin. Forms foi bifurcado do material apresentado no livro.

Vários tamanhos em xamarin. Forms até agora foram encontrados:


A altura da barra de status iOS é 20
O BoxView tem uma largura e altura padrão de 40
O padrão Padding em um Frame é 20
O padrão Spacing sobre o StackLayout é 6
O Device.GetNamedSize método retorna um tamanho de fonte numérica
Esses tamanhos não são pixels. Em vez disso, eles são unidades independentes de dispositivo reconhecidas
independentemente por cada plataforma.

Pixels, pontos, dps, quedas e DIUs


Logo no início do histórico do Microsoft Windows e Apple Mac, os programadores trabalharam em unidades de
pixels. No entanto, o advento de monitores de alta resolução necessária uma abordagem mais abstrata e
virtualizada para coordenadas de tela. No mundo do Mac, os programadores trabalharam em unidades de pontos,
tradicionalmente 1/72 polegada, enquanto os desenvolvedores do Windows usada unidades independentes de
dispositivo (DIUs) com base em 1/96 polegada.
Dispositivos móveis, no entanto, geralmente são mantidos muito mais próximos à face e ter uma resolução mais
alta que a área de trabalho telas, o que implica que uma maior densidade de pixel pode ser tolerada.
Os programadores direcionamento de dispositivos do Apple iPhone e iPad continuam a funcionar em unidades de
pontos de, mas existem 160 desses pontos por polegada. Dependendo do dispositivo, pode haver 1, 2 ou 3 pixels
para o ponto.
O Android é semelhante. Os programadores trabalham em unidades de pixels independentes de densidade (dps),
e a relação entre o dps e pixels é baseada no 160 dps por polegada.
Telefones do Windows e dispositivos móveis também tem estabelecido os fatores de dimensionamento que
implicam algo semelhante a 160 unidades independentes de dispositivo por polegada.

NOTE
Xamarin. Forms não oferece suporte a qualquer telefone com base em Windows ou dispositivo móvel.

Em resumo, um programador de xamarin. Forms, telefones e tablets de direcionamento pode assumir que todas
as unidades de medida são baseadas nos seguintes critérios:
160 unidades por polegada, equivalente a
64 unidades para o centímetro
Somente leitura Width e Height propriedades definidas por VisualElement têm o padrão "fictícios" valores de –
1. Somente quando um elemento foi dimensionado e acomodado em layout essas propriedades refletirá o
tamanho real do elemento em unidades independentes de dispositivo. Esse tamanho inclui qualquer Padding
definido no elemento, mas não o Margin .
Um elemento visual é acionado o SizeChanged evento quando seu Width ou Height foi alterado. O WhatSize
exemplo usa esse evento para exibir o tamanho da tela do programa.

Tamanhos de métrica
O MetricalBoxView usa WidthRequest e HeightRequest para exibir um BoxView uma polegada tall e outro
centímetro amplo.

Tamanhos de fonte estimado


O tamanhos de fonte exemplo mostra como usar a regra de 160 unidades-à-polegadas para especificar
tamanhos de fonte em unidades de pontos. A consistência visual entre as plataformas usando essa técnica é
melhor do que Device.GetNamedSize .

Ajuste de texto tamanho disponível


É possível ajustar um bloco de texto dentro de um retângulo determinado pelo cálculo de um FontSize do Label
usando os seguintes critérios:
Espaçamento entre linhas é 120% do tamanho da fonte (130% nas plataformas Windows).
Largura do caractere média é de 50% do tamanho da fonte.
O EstimatedFontSize que demonstra essa técnica. Este programa foi escrito antes do Margin propriedade
estava disponível, portanto, ele usa um ContentView com um Padding configuração para simular um margem.

Um relógio de tamanho de ajuste


O FitToSizeClock exemplo demonstra como usar Device.StartTimer para iniciar um timer que periodicamente
notifica o aplicativo quando é hora de atualizar o relógio. O tamanho da fonte é definido como um sexto da
largura da página para tornar a exibição tão grandes quanto possível.

Problemas de acessibilidade
O EstimatedFontSize programa e o FitToSizeClock os dois programas contêm uma falha sutil: se o usuário
altera as configurações de acessibilidade do telefone no Android ou Windows 10 Mobile, o programa não é mais
possível estimar o tamanho que o texto é renderizado com base no tamanho da fonte. O AccessibilityTest que
demonstra esse problema.

Empiricamente ajustando o texto


Outra maneira de ajustar o texto a um retângulo é empiricamente calcular o tamanho do texto renderizado e
ajustá-lo para cima ou para baixo. O programa nas chamadas de livro GetSizeRequest em um elemento visual
para obter o tamanho do elemento desejado. Que método foi substituído e programas em vez disso, devem
chamar Measure .
Para um Label , o primeiro argumento deve ser a largura do contêiner (para permitir o encapsulamento),
enquanto o segundo argumento deve ser definido para Double.PositiveInfinity para tornar a altura irrestrita. O
EmpiricalFontSize que demonstra essa técnica.

Links relacionados
Capítulo 5 de texto completo (PDF )
Exemplos do capítulo 5
Capítulo 5 F# amostras
Resumo do capítulo 6. Cliques de botão
12/04/2019 • 8 minutes to read

baixar o exemplo
O Button é o modo de exibição que permite que o usuário iniciar um comando. Um Button é identificado pelo
texto (e, opcionalmente, uma imagem conforme demonstrado capítulo 13, Bitmaps). Consequentemente, Button
define muitas das mesmas propriedades que Label :
Text
FontFamily
FontSize
FontAttributes
TextColor

Button também define três propriedades que determinam a aparência de sua borda, mas o suporte dessas
propriedades e seu mútua independência é específico da plataforma:
BorderColor do tipo Color
BorderWidth do tipo Double
BorderRadius do tipo Double

Button também herda todas as propriedades de VisualElement e View , incluindo BackgroundColor ,


HorizontalOptions , e VerticalOptions .

O clique de processamento
O Button classe define um Clicked evento que é acionado quando o usuário toca o Button . O Click
manipulador é do tipo EventHandler . O primeiro argumento é o Button gera o evento de objeto; o segundo
argumento é um EventArgs objeto que não fornece nenhuma informação adicional.
O ButtonLogger demonstra simples Clicked tratamento.

Cliques de botão de compartilhamento


Vários Button modos de exibição podem compartilhar a mesma Clicked manipulador, mas o manipulador
geralmente precisa determinar qual Button é responsável por um evento específico. Uma abordagem é
armazenar vários Button objetos como campos e verificar qual deles está acionando o evento no manipulador.
O TwoButtons que demonstra essa técnica. O programa também demonstra como definir a IsEnabled
propriedade de uma Button para false ao pressionar o Button não é mais válido. R desabilitado Button não
gera um Clicked eventos.

Manipuladores de eventos anônimos


É possível definir Clicked manipuladores como funções lambda anônima, como o ButtonLambdas demonstra.
No entanto, os manipuladores de anônimos não podem ser compartilhados sem um código confuso de reflexão.

Distinção entre exibições com IDs


Vários Button objetos também podem ser diferenciados, definindo o StyleId propriedade ou AutomationId
propriedade para um string . Essa propriedade é definida por Element , mas ele não é usado dentro do xamarin.
Forms. Ele destina-se a ser usado exclusivamente pelos programas de aplicativo.
O SimplestKeypad o exemplo usa o mesmo manipulador de eventos para todas as chaves de número 10 em um
teclado numérico e faz a distinção entre eles com o StyleId propriedade:

Salvando dados transitórios


Muitos aplicativos precisam para salvar os dados quando um programa é encerrado e recarregar os dados quando
o programa for iniciado novamente. O Application classe define vários membros que ajudam a salvar e restaurar
dados transitórios seu programa:
O Properties propriedade é um dicionário com string chaves e object itens. O conteúdo do dicionário
automaticamente é salvos no armazenamento local do aplicativo antes do encerramento do programa e
recarregado quando o programa é iniciado.
O Application classe define três métodos virtuais protegidos que o programa do padrão App substituições de
classe: OnStart , OnSleep , e OnResume . Elas fazem referência a ciclo de vida do aplicativo eventos.
O SavePropertiesAsync método salva o conteúdo do dicionário.
Não é necessário chamar SavePropertiesAsync . O conteúdo do dicionário é automaticamente salvas antes do
encerramento do programa e recuperado antes da inicialização do programa. É útil durante o teste de programa
para salvar dados em caso de falha do programa.
Também é útil:
Application.Current , uma propriedade estática que retorna o atual Application objeto que, em seguida, você
pode usar para obter o Properties dicionário.

A primeira etapa é identificar todas as variáveis na página que você deseja persistir quando o programa é
encerrado. Se você souber todos os locais em que alterar essas variáveis, você pode simplesmente adicioná-los
para o Properties dicionário nesse ponto. No construtor da página, você pode definir as variáveis a partir de
Properties dicionário se a chave existir.

Um programa maior provavelmente precisará lidar com eventos de ciclo de vida do aplicativo. O mais importante
é o OnSleep método. Uma chamada para esse método indica que o programa tenha deixado em primeiro plano.
Talvez o usuário pressiona o Home botão no dispositivo, ou exibidos todos os aplicativos ou está sendo desligado
o telefone. Uma chamada para OnSleep é a única notificação que um programa recebe antes que seja finalizado. O
programa deve aproveitar esta oportunidade para garantir que o Properties dicionário está atualizado.
Uma chamada para OnResume indica que o programa não foi encerrado após a última chamada para OnSleep ,
mas agora está em execução em primeiro plano novamente. O programa pode usar essa oportunidade para
atualizar as conexões de internet (por exemplo).
Uma chamada para OnStart ocorre durante a inicialização do programa. Não é necessário aguardar até que esse
método de chamada para o acesso a Properties dicionário porque o conteúdo já ter sido restaurado quando o
App construtor é chamado.

O PersistentKeypad exemplo é muito semelhante à SimplestKeypad exceto que o programa usa o OnSleep
substituição é para salvar a entrada de teclado atual, e o construtor de página para restaurar os dados.

NOTE
Outra abordagem para salvar as configurações do programa é fornecida pelo Xamarin.Essentials preferências classe.

Links relacionados
Capítulo 6 de texto completo (PDF )
Exemplos do capítulo 6
Capítulo 6 F# amostras
Botão de xamarin. Forms
Resumo do capítulo 7. XAML versus código
12/04/2019 • 10 minutes to read

baixar o exemplo

NOTE
Observações sobre essa página indicam áreas onde o xamarin. Forms foi bifurcado do material apresentado no livro.

Xamarin. Forms dá suporte a uma linguagem de marcação baseada em XML chamada o de Extensible Application
Markup Language ou XAML (pronunciada "zammel"). XAML fornece uma alternativa para c# na definição do
layout da interface do usuário de um aplicativo xamarin. Forms e definir associações entre os elementos de
interface do usuário e os dados subjacentes.

Propriedades e atributos
Estruturas e classes do xamarin. Forms 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 público sem parâmetros. Todas as propriedades definidas em XAML devem ter público set
acessadores.
Para as propriedades dos tipos de dados básicos ( string , double , bool e assim por diante), o analisador XAML
usa o padrão de TryParse métodos para converter as configurações de atributo para esses tipos. O analisador
XAML também facilmente pode lidar com tipos de enumeração, e ele pode combinar os membros de enumeração
se o tipo de enumeração é sinalizado com o Flags atributo.
Para ajudar o analisador XAML, os tipos mais complexos (ou propriedades desses tipos) podem incluir um
TypeConverterAttribute que identifica uma classe que deriva de TypeConverter que dá suporte à conversão de
valores de cadeia de caracteres para esses tipos. Por exemplo, o ColorTypeConverter converte cores nomes e
cadeias de caracteres, como "#rrggbb", em Color valores.

Sintaxe de elemento de propriedade


No XAML, classes e os objetos criados a partir delas são expressas 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 atributos de propriedade.
Às vezes, uma propriedade deve ser definida como um objeto que não pode ser expresso como uma cadeia de
caracteres simple. Nesse caso, o XAML oferece suporte a uma marca chamada de um elemento de propriedade
que consiste o nome de classe e o nome de propriedade separados por um período. Um elemento de objeto, em
seguida, pode aparecer dentro de um par de marcas de elemento de propriedade.

Adicionando uma página XAML ao seu projeto


Uma biblioteca de classes portátil do xamarin. Forms pode conter uma página XAML quando ele é criado, ou você
pode adicionar uma página XAML para 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 .)
NOTE
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 do c# é conhecido como o de lógica 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 de arquivo code-behind.

Durante o tempo de execução, na conclusão do InitializeComponent chamar, todos os elementos do arquivo


XAML foram instanciados e inicializados como se ele tinham 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, um para os elementos de xamarin. Forms e o outro definindo um x prefixo para elementos e
atributos intrínsecos para todas as implementações de 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 coincide com o nome de namespace
e classe no arquivo code-behind.
A combinação de código e XAML é demonstrada pelo CodePlusXaml exemplo.

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 é compilado, o XAML é analisado no momento da compilação e o
arquivo XAML é incorporado na PCL, onde também é analisada em tempo de execução. Se o XAML é compilado,
o processo de compilação converte a XAML em um formato binário, e o processamento de tempo de execução é
mais eficiente.

Especificidade da plataforma no arquivo XAML


No XAML, o OnPlatform classe pode ser usada para selecionar a marcação de dependente de plataforma. Essa é
uma classe genérica e deve ser instanciada com um x:TypeArguments atributo que corresponde ao tipo de destino.
O OnIdiom classe é semelhante, mas usados com muito menos frequência.
O uso de OnPlatform foi alterado desde que o livro foi publicado. Ele foi originalmente usado em conjunto com as
propriedades nomeadas iOS , Android , e WinPhone . Agora, ele é usado com filho On objetos. Defina as
Platform propriedade como uma cadeia de caracteres consistente com o público const campos do Device
classe. Defina a Value propriedade um valor consistente com o x:TypeArguments atributo do OnPlatform marca.
OnPlatform é demonstrada na ScaryColorList amostra, assim chamada porque contém blocos de XAML
praticamente idêntica. A existência dessa marcação repetitivas sugere que as técnicas devem estar disponíveis
para reduzi-lo.

Os atributos de propriedade de conteúdo


Alguns elementos de propriedade ocorrerem com muita frequência, como o <ContentPage.Content> marca no
elemento raiz de um ContentPage , ou o <StackLayout.Children> marca que inclui os filhos do StackLayout .
Cada classe é permitida 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 TextVariations exemplo contém vários exemplos de configuração do Text e FormattedText propriedades de
Label . No XAML, Span objetos aparecem como filhos do FormattedString objeto.

Quando uma cadeia de caracteres de várias linhas é definida como o Text propriedade, os caracteres de final de
linha são convertidos em caracteres de espaço, mas os caracteres de final de linha são preservados quando uma
cadeia de caracteres multilinha é exibido como o conteúdo do Label ou Label.Text marcas:

Links relacionados
Capítulo 7 de texto completo (PDF )
Exemplos do capítulo 7
Capítulo 7 F# exemplo
Noções básicas de XAML
Resumo do capítulo 8. Código e XAML em harmonia
12/04/2019 • 5 minutes to read

baixar o exemplo
Este capítulo explora mais profundamente o XAML, e particularmente como código e XAML interagem.

Passando argumentos
Em geral, uma classe instanciada em XAML deve ter um construtor público sem parâmetros; o objeto resultante é
inicializado por meio das configurações de propriedade. No entanto, há duas outras maneiras de objetos podem
ser instanciados e inicializados.
Embora essas sejam as técnicas de finalidade geral, eles são usados principalmente em conjunto com os modelos
de exibição do MVVM.
Construtores com argumentos
O ParameteredConstructorDemo exemplo demonstra como usar o x:Arguments marca para especificar
argumentos de construtor. Esses argumentos devem ser delimitados por marcas de elemento que indica o tipo do
argumento. Para os tipos de dados básicos do .NET, as seguintes marcas estão disponíveis:
x:Object
x:Boolean
x:Byte
x:Int16
x:Int32
x:Int64
x:Single
x:Double
x:Decimal
x:Char
x:String
x:TimeSpan
x:Array
x:DateTime

Pode chamar métodos de XAML?


O FactoryMethodDemo exemplo demonstra como usar o x:FactoryMethod elemento para especificar um
método de fábrica é invocado para criar um objeto. Tal método de fábrica deve ser público e estático, e ele deve
criar um objeto do tipo no qual ele está definido. (Por exemplo o Color.FromRgb método qualifica porque ele é
público e estático e retorna um valor do tipo Color .) Os argumentos para o método de fábrica são especificados
dentro do x:Arguments marcas.

O atributo X:Name
O x:Name atributo permite que um objeto instanciado no XAML a ser dado um nome. As regras para esses nomes
são os mesmos nomes de variáveis em C#. Após o retorno do InitializeComponent chamar no construtor, o
arquivo code-behind pode fazer referência a esses nomes para acessar o elemento XAML correspondente. Os
nomes são realmente convertidos pelo analisador XAML em campos particulares na classe parcial gerada.
O XamlClock exemplo demonstra o uso de x:Name para permitir que o arquivo code-behind manter dois Label
elementos definidos no XAML atualizado com a data e hora atuais.
O mesmo nome não pode ser usado para vários elementos na mesma página. Isso é um problema específico, se
você usar OnPlatform paralela de criar objetos nomeados para cada plataforma. O PlatformSpecificLabele
exemplo demonstra uma maneira melhor de fazer algo parecido.

Modos de exibição personalizados baseados em XAML


Há várias maneiras de evitar a repetição de marcação no XAML. Uma técnica comum é criar uma nova classe
baseada em XAML que deriva de ContentView . Essa técnica é demonstrada na ColorViewList exemplo. O
ColorView classe deriva ContentView para exibir uma cor específica e seu nome, enquanto o ColorViewListPage
classe deriva ContentPage como de costume e explicitamente cria instâncias de 17 de ColorView .
Acessando o ColorView classe em XAML exige outra declaração de namespace XML, chamada normalmente
local para classes no mesmo assembly.

Eventos e manipuladores
Eventos podem ser atribuídos a manipuladores de eventos no XAML, mas o manipulador de eventos deve ser
implementado no arquivo code-behind. O XamlKeypad demonstra como criar uma interface de usuário de
teclado em XAML e como implementar o Clicked manipuladores no arquivo code-behind.

Gestos de toque
Qualquer Viewobjeto pode obter entrada de toque e gerar eventos de entrada. O View classe define um
GestureRecognizers propriedade de coleção que pode conter um ou mais instâncias de classes que derivam
GestureRecognizer .

O TapGestureRecognizer gera Tapped eventos. O MonkeyTap programa demonstra como anexar


TapGestureRecognizer objetos para quatro BoxView elementos para criar um jogo uma imitação:

Mas o MonkeyTap programa realmente precisa de som. (Consulte próximo capítulo.)

Links relacionados
Texto completo do capítulo 8 (PDF )
Exemplos do capítulo 8
Capítulo 8 F# exemplo
Passando argumentos em XAML
Resumo do capítulo 9. Chamadas à API específicas
da plataforma
12/04/2019 • 3 minutes to read

baixar o exemplo

NOTE
Observações sobre essa página indicam áreas onde o xamarin. Forms foi bifurcado do material apresentado no livro.

Às vezes, é necessário executar algum código que varia por plataforma. Este capítulo explora as técnicas.

Pré-processamento no projeto ativo compartilhado


Um projeto de ativo compartilhado do xamarin. Forms pode executar um código diferente para cada plataforma
usando as diretivas de pré-processador c# #if , #elif , e endif . Isso é demonstrado em PlatInfoSap1:

No entanto, o código resultante pode ser desagradável e difícil de ler.

Classes de paralelas no projeto ativo compartilhado


Uma abordagem mais estruturada para a execução de código específico da plataforma no SAP é demonstrada na
PlatInfoSap2 exemplo. Cada um dos projetos de plataforma contém uma classe nomeada de forma idêntica e
métodos, mas implementado para a plataforma específica. O SAP, em seguida, simplesmente instancia a classe e
chama o método.

DependencyService e a biblioteca de classes portátil


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

Uma biblioteca normalmente não é possível acessar classes em projetos de aplicativos. Essa restrição parece
impedir que a técnica mostrada PlatInfoSap2 sejam usados em uma biblioteca. No entanto, o xamarin. Forms
contém uma classe chamada DependencyService que usa a reflexão do .NET para acessar as classes públicas no
projeto de aplicativo da biblioteca.
A biblioteca deve definir um interface com os membros que ele precisa usar em cada plataforma. Em seguida,
cada uma das plataformas contém uma implementação dessa interface. A classe que implementa a interface deve
ser identificada com uma DependencyAttribute no nível de assembly.
A biblioteca, em seguida, usa o genérico Get método DependencyService para obter uma instância da classe de
plataforma que implementa a interface.
Isso é demonstrado na DisplayPlatformInfo exemplo.

Geração de som específica da plataforma


O MonkeyTapWithSound exemplo adiciona o alarme sonoro para o MonkeyTap programa acessando
recursos de geração de som em cada plataforma.

Links relacionados
Texto completo do capítulo 9 (PDF )
Exemplos do capítulo 9
Serviço de dependência
Resumo do capítulo 10. Extensões de marcação
XAML
12/04/2019 • 7 minutes to read

baixar o exemplo
Normalmente, o analisador XAML Converte qualquer cadeia de caracteres definido como um valor de atributo
para o tipo da propriedade com base em conversões padrão para os tipos de dados básicos do .NET, ou um
TypeConverter derivativo anexado à propriedade ou seu tipo com um TypeConverterAttribute .

Mas, às vezes, é conveniente definir um atributo de uma fonte diferente, por exemplo, um item em um dicionário
ou o valor da propriedade ou campo, ou de um cálculo de algum tipo.
Esse é o trabalho de um extensão de marcação XAML. Apesar do nome, extensões de marcação XAML são não
uma extensão do XML. XAML é sempre XML legal.

A infraestrutura de código
Uma extensão de marcação XAML é uma classe que implementa o IMarkupExtension interface. Essa classe tem
muitas vezes a palavra Extension no final de seu nome, mas geralmente aparece no XAML sem o sufixo.
As seguintes extensões de marcação XAML têm suporte de todas as implementações de XAML:
x:Static com suporte StaticExtension
x:Reference com suporte ReferenceExtension
x:Type com suporte TypeExtension
x:Null com suporte NullExtension
x:Array com suporte ArrayExtension

Essas quatro extensões de marcação XAML têm suporte por muitas implementações de XAML, incluindo o
xamarin. Forms:
StaticResource com suporte StaticResourceExtension
DynamicResource com suporte DynamicResourceExtension
Binding com suporte pelo BindingExtension —discutidos capítulo 16. Associação de dados
TemplateBinding com suporte pelo TemplateBindingExtension —não abordados no livro

Uma extensão de marcação XAML adicional é incluída no xamarin. Forms em conexão com RelativeLayout :
ConstraintExpression —não são abordados no livro

Acesso a membros estáticos


Use o x:Static elemento para definir um atributo para o valor de um membro de enumeração, campo ou
propriedade estático público. Defina as Member propriedade para o membro estático. É geralmente mais fácil
especificar x:Static e o nome do membro entre chaves. O nome da Member propriedade não precisam ser
incluídos, apenas o próprio membro. Essa sintaxe comum é mostrada na SharedStatics exemplo. Os campos
estáticos em si são definidos na AppConstants classe. Essa técnica permite que você estabeleça constantes usadas
por meio de um programa.
Com uma declaração de namespace XML adicional, você pode fazer referência a propriedades públicas estáticas,
campos ou membros de enumeração definidos no .NET framework, conforme demonstrado a SystemStatics
exemplo .

Dicionários de recurso
O VisualElement classe define uma propriedade chamada Resources que podem ser definidas para um objeto do
tipo ResourceDictionary . Dentro do XAML, você pode armazenar itens neste dicionário e identificá-los com o
x:Key atributo. Os itens armazenados no dicionário de recursos são compartilhados entre todas as referências
para o item.
StaticResource para a maioria das finalidades
Na maioria dos casos você usará o StaticResource extensão de marcação para referenciar um item do dicionário
de recursos, como demonstrado pelo ResourceSharing exemplo . Você pode usar um StaticResourceExtension
elemento ou StaticResource entre chaves:

Não confunda a x:Static extensão de marcação e o StaticResource extensão de marcação.


Uma árvore de dicionários
Quando o analisador XAML encontra uma StaticResource , ele começa a procurar na árvore visual para uma
chave correspondente e, em seguida, examina os ResourceDictionary na caixa de diálogo App classe. Isso permite
que os itens em um dicionário de recurso mais profundo na árvore visual para substituir um dicionário de recursos
superior na árvore visual. Isso é demonstrado na ResourceTrees exemplo.
DynamicResource para fins especiais
O StaticResource extensão de marcação faz com que um item a ser recuperado do dicionário quando uma árvore
visual é criada durante a InitializeComponent chamar. Uma alternativa à StaticResource está DynamicResource ,
que mantém um link para a chave do dicionário e atualiza o destino quando o item referenciado pelas alterações
de chave.
A diferença entre StaticResource e DynamicResource é demonstrada na DynamicVsStatic exemplo.
Uma propriedade definida pelo DynamicResource deve ser retornado por uma propriedade vinculável, conforme
discutido em capítulo 11, a infraestrutura associável.

Extensões de marcação menos usados


Use o x:Null extensão de marcação para definir uma propriedade null .
Use o x:Type extensão de marcação para definir uma propriedade para um .NET Type objeto.
Use x:Array para definir uma matriz. Especifique o tipo dos membros da matriz, definindo o [ Type ] propriedade
para um x:Type extensão de marcação.

Uma extensão de marcação personalizada


Você pode criar suas próprias extensões de marcação XAML, escrevendo uma classe que implementa o
IMarkupExtension interface com um ProvideValue método.

O HslColorExtension classe atende a esses requisitos. Ele cria um valor do tipo Color com base nos valores de
propriedades nomeadas H , S , L , e A . Essa classe é o primeiro item em uma biblioteca do xamarin. Forms
denominada Xamarin.FormsBook.Toolkit que é criado e usado ao longo deste manual.
O CustomExtensionDemo que demonstra como usar a extensão de marcação personalizada e fazer referência a
essa biblioteca.

Links relacionados
Capítulo 10 de texto completo (PDF )
Capítulo 10 amostras
Extensões de marcação XAML
Resumo do Capítulo 11. A infraestrutura associável
12/04/2019 • 8 minutes to read

baixar o exemplo
Todo programador de c# está familiarizado com C# propriedades. Propriedades contêm uma definir acessador
e/ou um obter acessador. Eles são chamados propriedades CLR para o Common Language Runtime.
Xamarin. Forms define uma definição de propriedade aprimorada chamada um propriedade associável
encapsulado pelo BindableProperty classe e compatíveis com o BindableObject classe. Essas classes são bastante
distintas mas relacionados: O BindableProperty é usado para definir a propriedade em si; BindableObject é como
object é de uma classe base para classes que definem propriedades associáveis.

A hierarquia de classes xamarin. Forms


O ClassHierarchy exemplo usa a reflexão para exibir uma hierarquia de classes do xamarin. Forms e demonstrar
o papel crucial desempenhado por BindableObject nesta hierarquia. BindableObject deriva Object e é a classe
pai Element dos quais VisualElement deriva. Isso é a classe pai Page e View , que é a classe pai Layout :

Uma espiada no BindableObject e BindableProperty


Nas classes que derivam de BindableObject muitas propriedades CLR devem ser "apoio" propriedades
associáveis. Por exemplo, o Text propriedade do Label classe é uma propriedade CLR, mas o Label classe
também define um campo estático público somente leitura denominado TextProperty de tipo BindableProperty .
Um aplicativo pode definir ou obter o Text propriedade de Label normalmente, ou o aplicativo pode definir o
Text chamando o SetValue método definido pelo BindableObject com um Label.TextProperty argumento. Da
mesma forma, um aplicativo pode obter o valor da Text propriedade chamando o GetValue método, novamente
com um Label.TextProperty argumento. Isso é demonstrado pelo PropertySettings exemplo.
Na verdade, o Text propriedade CLR é totalmente implementada usando o SetValue e GetValue métodos
definidos pelo BindableObject em conjunto com o Label.TextProperty propriedade estática.

BindableObject e BindableProperty oferecem suporte para:


Fornecendo valores padrão de propriedades
Armazenando seus valores atuais
Fornece mecanismos para validar valores de propriedade
Manter a consistência entre as propriedades relacionadas em uma única classe
Responder às alterações de propriedade
Disparando notificações quando uma propriedade está prestes a ser alterada ou foi alterada
Suporte a vinculação de dados
Suporte a estilos
Suporte a recursos dinâmicos
Sempre que uma propriedade que é apoiada por uma propriedade associável é alterada, BindableObject dispara
uma PropertyChanged evento identifica a propriedade que foi alterada. Esse evento não é acionado quando a
propriedade é definida com o mesmo valor.
Algumas propriedades não são apoiadas por propriedades vinculáveis e algumas classes xamarin. Forms — ,
como Span — não derivam de BindableObject . Uma classe que deriva de BindableObject pode dar suporte a
propriedades associáveis porque BindableObject define o SetValue e GetValue métodos.
Porque Span não é derivado de BindableObject , nenhuma de suas propriedades — como Text — contam com
uma propriedade associável. É por isso que uma DynamicResource definindo na Text propriedade de Span gera
uma exceção no DynamicVsStatic amostra no capítulo anterior. O DynamicVsStaticCode exemplo demonstra
como definir os recursos dinâmicos no código usando o SetDynamicResource método definido pelo Element . O
primeiro argumento é um objeto do tipo BindableProperty .
Da mesma forma, o SetBinding método definido pelo BindableObject tem um primeiro argumento do tipo
BindableProperty .

Definindo propriedades vinculáveis


Você pode definir suas próprias propriedades vinculáveis usando estático BindableProperty.Create método para
criar um campo estático somente leitura do tipo BindableProperty .
Isso é demonstrado na AltLabel classe os Xamarin.FormsBook.Toolkit biblioteca. A classe deriva de Label e
permite que você especifique um tamanho de fonte em pontos. Ele é demonstrado na PointSizedText exemplo.
Quatro argumentos do BindableProperty.Create método são necessários:
propertyName : o nome de texto da propriedade (o mesmo que o nome da propriedade CLR )
returnType : o tipo da propriedade CLR
declaringType : o tipo da classe declarando a propriedade
defaultValue : o valor da propriedade padrão

Porque defaultValue é do tipo object , o compilador deve ser capaz de determinar o tipo do valor padrão. Por
exemplo, se o returnType está double , o defaultValue deve ser definido para algo como 0,0, em vez de apenas 0,
ou a incompatibilidade de tipo irá disparar uma exceção em tempo de execução.
Também é muito comum para uma propriedade associável incluem:
propertyChanged : um método estático chamado quando a propriedade de valor é alterado. O primeiro
argumento é a instância da classe cuja propriedade foi alterada.
Os outros argumentos BindableProperty.Create não são tão comuns:
: usado em conjunto com a vinculação de dados (conforme discutido em capítulo 16.
defaultBindingMode
Associação de dados)
validateValue : um retorno de chamada para verificar se há um valor válido
propertyChanging : um retorno de chamada para indicar quando a propriedade está prestes a ser alterada
coerceValue : um retorno de chamada para forçar um valor de conjunto para outro valor
defaultValueCreate : um retorno de chamada para criar um valor padrão que não pode ser compartilhado entre
instâncias da classe (por exemplo, uma coleção)
A propriedade associável somente leitura
Uma propriedade associável pode ser somente leitura. Criação de uma propriedade associável somente leitura
requer chamando o método estático BindableProperty.CreateReadOnly para definir um estático somente leitura
campo particular do tipo BindablePropertyKey .
Em seguida, defina a propriedade CLR set accesor como private para chamar um SetValue sobrecarga com o
BindablePropertyKey objeto. Isso impede que a propriedade sendo definida fora da classe.

Isso é demonstrado na CountedLabel classe usada na BaskervillesCount exemplo.

Links relacionados
Capítulo 11 de texto completo (PDF )
Exemplos do Capítulo 11
Propriedades vinculáveis
Resumo do capítulo 12. Estilos
12/04/2019 • 8 minutes to read

baixar o exemplo
No xamarin. Forms, os estilos permitem vários modos de exibição compartilhar uma coleção de configurações de
propriedade. Isso reduz a marcação e permite que temas visuais consistentes de manutenção.
Estilos de quase sempre são definidos e consumidos na marcação. Um objeto do tipo Style é instanciado em um
dicionário de recursos e, em seguida, defina como o Style propriedade de um elemento visual usando um
StaticResource ou DynamicResource marcação extensão.

O estilo básico
Um Style requer que seu TargetType ser definido como o tipo do objeto visual, ele se aplica ao. Quando um
Style é instanciado em um dicionário de recursos (como é comum) também requer um x:Key atributo.
O Style tem uma propriedade content do tipo Setters , que é uma coleção de Setter objetos. Cada Setter
associa um Property com um Value .
No XAML a Property configuração é o nome de uma propriedade CLR (como o Text propriedade de Button ),
mas a propriedade com estilo deve ser feita por uma propriedade associável. Além disso, a propriedade deve ser
definida na classe indicada pela TargetType configuração ou herdadas por essa classe.
Você pode especificar o Value usando o elemento de propriedade de configuração <Setter.Value> . Isso permite
que você defina Value a um objeto que não pode ser expressos em uma cadeia de caracteres de texto, ou como
um OnPlatform do objeto ou a um objeto instanciado usando x:Arguments ou x:FactoryMethod . O Value
propriedade também pode ser definida com um StaticResource expressão para outro item no dicionário.
O BasicStyle demonstra a sintaxe básica de programa e mostra como fazer referência a Style com um
StaticResource extensão de marcação:

O Style objeto e qualquer objeto criado na Style do objeto como um Value configuração são compartilhados
entre todas as exibições, fazendo referência a ela Style . O Style não pode conter qualquer coisa que não podem
ser compartilhados, como um View derivado.
Manipuladores de eventos não podem ser definidos um Style . O GestureRecognizers propriedade não pode ser
definida um Style porque ele não é feito por uma propriedade associável.

Estilos de código
Embora não seja comum, você pode instanciar e inicializar Style objetos no código. Isso é demonstrado pelo
BasicStyleCode exemplo.

Herança de estilo
Style tem um BasedOn propriedade que pode ser definida para um StaticResource referenciando outro estilo de
extensão de marcação. Isso permite que os estilos de herdar de estilos anteriores e adicionar ou substituir as
configurações de propriedade. O StyleInheritance demonstra isso.
Se Style2 se baseia Style1 , o TargetType de Style2 deve ser o mesmo que Style1 ou derivado de Style1 . O
dicionário de recursos no qual Style1 é armazenado deve ser o mesmo dicionário de recursos como Style2 ou
um dicionário de recursos superior na árvore visual.

Estilos implícitos
Se um Style em um recurso de dicionário não tem um x:Key atributo de configuração, ele é atribuído a uma
chave de dicionário automaticamente e o Style objeto se torna um estilo implícito. Um modo de exibição sem um
Style configuração e cujo tipo corresponde a TargetType exatamente encontrará esse estilo, como o
ImplicitStyle demonstra.
Um estilo implícito pode derivar de uma Style com um x:Key configuração, mas não o oposto. Você não pode
referenciar explicitamente um estilo implícito.
Você pode implementar os três tipos de hierarquia com estilos e BasedOn :
Os estilos definidos na Application e Page para baixo até os estilos definidos nos layouts inferiores na árvore
visual.
De estilos definidos para as classes base, como VisualElement e View para os estilos definidos para as classes
específicas.
De estilos com chaves de dicionário explícita para estilos implícitos.
Essas hierarquias são demonstradas a StyleHierarchy exemplo.

Estilos dinâmicos
Um estilo em um dicionário de recursos pode ser referenciado por DynamicResource em vez de StaticResource .
Isso faz com que o estilo de um estilos dinâmica. Se esse estilo é substituído no dicionário de recursos por outro
estilo com a mesma chave, os modos de exibição referenciando esse estilo com DynamicResource é alterada
automaticamente. Além disso, a ausência de uma entrada no dicionário com a chave especificada fará com que
StaticResource para gerar uma exceção, mas não DynamicResource .

Você pode usar essa técnica para alterar dinamicamente o estilo ou temas como o DynamicStyles demonstra.
No entanto, não é possível definir a BasedOn propriedade para um DynamicResource extensão de composição
porque BasedOn não é apoiada por uma propriedade associável. Para derivar um estilo dinamicamente, não defina
BasedOn . Em vez disso, defina as BaseResourceKey propriedade para a chave do dicionário do estilo que você
deseja derivar de. O DynamicStylesInheritance que demonstra essa técnica.

Estilos de dispositivo
O Device.Styles classe aninhada define doze campos estáticos somente leitura para seis estilos com um
TargetType de Label que você pode usar para tipos comuns de usos de texto.
Seis desses campos são do tipo Style que você pode definir diretamente a um Style propriedade no código:
BodyStyle
TitleStyle
SubtitleStyle
CaptionStyle
ListItemTextStyle
ListItemDetailTextStyle

Seis campos são do tipo string e podem ser usados como chaves de dicionário para estilos dinâmicos:
BodyStyleKey igual a "BodyStyle"
TitleStyleKey igual a "TitleStyle"
SubtitleStyleKey igual a "SubtitleStyle"
CaptionStyleKey igual a "CaptionStyle"
ListItemTextStyleKey igual a "ListItemTextStyle"
ListItemDetailTextStyleKey igual a "ListItemDetailTextStyle"

Esses estilos são ilustrados pela DeviceStylesList exemplo.

Links relacionados
Capítulo 12 de texto completo (PDF )
Exemplos do capítulo 12
Estilos
Resumo do capítulo 13. Bitmaps
12/04/2019 • 19 minutes to read

baixar o exemplo

NOTE
Observações sobre essa página indicam áreas onde o xamarin. Forms foi bifurcado do material apresentado no livro.

O xamarin. Forms Image elemento exibe um bitmap. Todas as plataformas do xamarin. Forms dão suporte os
formatos de arquivo JPEG, PNG, GIF e BMP.
Bitmaps no xamarin. Forms é proveniente de quatro lugares:
Por meio da web conforme especificado por uma URL
Incorporado como um recurso na biblioteca compartilhada
Incorporado como um recurso nos projetos de aplicativo da plataforma
Em qualquer lugar que pode ser referenciado por um .NET Stream do objeto, incluindo MemoryStream

Recursos de bitmap na biblioteca compartilhada são independentes de plataforma, enquanto os recursos de


bitmap em projetos de plataforma são específicos da plataforma.

NOTE
O texto do livro faz referência a bibliotecas de classes portáteis, foram substituídos por bibliotecas .NET Standard. O código
de exemplo do livro foi convertido para usar bibliotecas padrão do .NET.

O bitmap é especificado pela configuração de Source propriedade do Image a um objeto do tipo ImageSource ,
uma classe abstrata com três derivativos:
UriImageSource para acessar um bitmap pela web com base em um Uri objeto definido como seu Uri
propriedade
FileImageSource para acessar um bitmap armazenado em um projeto de aplicativo de plataforma com base
em um caminho de pasta e arquivo definido como seu File propriedade
StreamImageSource para carregar um bitmap usando um .NET Stream objeto especificado, retornando um
Stream de uma Func definido como seu Stream propriedade

Como alternativa (e mais comum), você pode usar os seguintes métodos estáticos do ImageSource classe, todos
os quais retornam ImageSource objetos:
ImageSource.FromUri para acessar um bitmap pela web com base em um Uri objeto
ImageSource.FromResource para acessar um bitmap armazenado como um recurso inserido no aplicativo PCL;
ImageSource.FromResource ou ImageSource.FromResource para acessar um bitmap em outro assembly de
código-fonte
ImageSource.FromFile para acessar um bitmap de um projeto de aplicativo de plataforma
ImageSource.FromStream para carregar um bitmap com base em um Stream objeto

Não há nenhum equivalente a classe a Image.FromResource métodos. O UriImageSource classe é útil se você
precisar controlar o cache. O FileImageSource classe é útil em XAML. StreamImageSource é útil para o
carregamento assíncrono do Stream objetos, enquanto ImageSource.FromStream é síncrono.

Bitmaps independente de plataforma


O WebBitmapCode projeto carrega um bitmap com o uso de web ImageSource.FromUri . O Image é definido
como o Content propriedade do ContentPage , portanto, ele é restrito para o tamanho da página.
Independentemente do tamanho do bitmap, um restrito Image elemento é estendido para o tamanho de seu
contêiner e o bitmap é exibido em seu tamanho máximo dentro a Image elemento mantendo a taxa de proporção
do bitmap. Áreas do Image além de bitmap pode ser colorido com BackgroundColor .
O WebBitmapXaml exemplo é semelhante, mas simplesmente define o Source propriedade para a URL. A
conversão é tratada pelos ImageSourceConverter classe.
Ajuste e preenchimento
Você pode controlar como o bitmap é esticado definindo a Aspect propriedade do Image para um dos seguintes
membros da Aspect enumeração:
AspectFit : respeita a taxa de proporção (padrão)
Fill : preenche a área, não respeita a taxa de proporção
AspectFill : preenche a área, mas respeita a taxa de proporção, realizada por parte do bitmap de corte

Recursos inseridos
Você pode adicionar um arquivo de bitmap para uma PCL ou para uma pasta na PCL. Dê a ela um ação de
compilação dos EmbeddedResource. O ResourceBitmapCode exemplo demonstra como usar
ImageSource.FromResource para carregar o arquivo. O nome do recurso passado para o método consiste o nome
do assembly, seguido por um ponto, seguido pelo nome da pasta opcional e um ponto, seguido pelo nome de
arquivo.
O programa define a VerticalOptions e HorizontalOptions propriedades da Image para LayoutOptions.Center ,
que torna o Image elemento irrestrita. O Image e o bitmap são do mesmo tamanho:
No iOS e Android, o Image é o tamanho de pixel do bitmap. Há um mapeamento individual entre pixels de
bitmap e tela.
Na plataforma Universal do Windows, o Image é o tamanho de pixel do bitmap em unidades independentes
de dispositivo. Na maioria dos dispositivos, cada pixel de bitmap ocupa várias pixels da tela.
O StackedBitmap exemplo coloca um Image em uma vertical StackLayout em XAML. Uma extensão de
marcação chamada ImageResourceExtension ajuda a fazer referência ao recurso incorporado no XAML. Essa classe
carrega apenas recursos do assembly no qual ele está localizado, portanto, ele não pode ser colocado em uma
biblioteca.
Obter mais informações sobre dimensionamento
Muitas vezes é desejável bitmaps de tamanho consistentemente entre todas as plataformas. Experimentando
StackedBitmap, você pode definir um WidthRequest sobre o Image elemento em uma vertical StackLayout
tornar o tamanho consistente entre as plataformas, mas você pode apenas reduzir o tamanho usando essa técnica.
Você também pode definir o HeightRequest garantir a imagem dimensiona consistente nas plataformas, mas a
restrita largura do bitmap limitará a versatilidade dessa técnica. Para uma imagem em uma vertical StackLayout ,
HeightRequest deve ser evitado.

A melhor abordagem é começar com um bitmap mais largo do que a largura do telefone em unidades
independentes de dispositivo e definir WidthRequest para uma largura desejada em unidades independentes de
dispositivo. Isso é demonstrado na DeviceIndBitmapSize exemplo.
O MadTeaParty exibe o capítulo 7 de Lewis Carroll aventuras de Alice no país das Maravilhas com as ilustrações
originais por John Tenniel:

Navegando e aguardando
O ImageBrowser amostra permite que o usuário navegue por meio de imagens de estoque armazenadas no site
do Xamarin. Ele usa o .NET WebRequest classe para baixar um arquivo JSON com a lista de bitmaps.

NOTE
Programas do xamarin. Forms devem usar HttpClient vez WebRequest para acessar arquivos pela internet.

O programa usa uma ActivityIndicator para indicar que algo está acontecendo. Conforme cada bitmap está
carregando, somente leitura IsLoading propriedade do Image é true . O IsLoading propriedade é feita por uma
propriedade vinculável, portanto, um PropertyChanged evento é disparado quando essa propriedade é alterado. O
programa anexa um manipulador para este evento e usará a configuração atual do IsLoaded para definir o
IsRunning propriedade do ActivityIndicator .

Bitmaps de streaming
O ImageSource.FromStream método cria um ImageSource com base em um .NET Stream . O método deve receber
uma Func objeto que retorna um Stream objeto.
Acessando os fluxos
O BitmapStreams exemplo demonstra como usar o ImaageSource.FromStream método para carregar um bitmap
armazenado como um recurso inserido e para carregar um bitmap em toda a web.
Gerar bitmaps em tempo de execução
O formato de arquivo não compactado do BMP, que é fácil construir no código e, em seguida, armazenar em dar
suporte a todas as plataformas do xamarin. Forms um MemoryStream . Essa técnica permite a criação de forma
algorítmica bitmaps em tempo de execução, conforme implementado de BmpMaker classe no
Xamrin.FormsBook.Toolkit biblioteca.
O "faça você mesmo" DiyGradientBitmap exemplo demonstra o uso de BmpMaker para criar um bitmap com
uma imagem gradiente.

Bitmaps de específico da plataforma


Todas as plataformas do xamarin. Forms permitem armazenar bitmaps nos assemblies do aplicativo de
plataforma. Quando recuperada por um aplicativo xamarin. Forms, esses bitmaps de plataforma são do tipo
FileImageSource . Você usá-los para:

o Icon propriedade de MenuItem


o Icon propriedade de ToolbarItem
o Image propriedade de Button

Os assemblies de plataforma já conterem bitmaps, ícones e telas de abertura:


No projeto do iOS, nos recursos pasta
No projeto do Android, nas subpastas dos recursos pasta
Em projetos do Windows, nos ativos pasta (embora as plataformas Windows não restringir bitmaps para essa
pasta)
O PlatformBitmaps exemplo usa o código para exibir um ícone de projetos de aplicativos de plataforma.
Resoluções de bitmap
Todas as plataformas permitem armazenar várias versões das imagens de bitmap para resoluções de dispositivos
diferentes. Em tempo de execução, a versão apropriada é carregada com base na resolução da tela do dispositivo.
No iOS, esses bitmaps são diferenciados por um sufixo de nome de arquivo:
Nenhum sufixo para dispositivos de 160 DPI (de 1 pixel para a unidade independente de dispositivo)
'@2x' sufixo para dispositivos de 320 DPI (2 pixels para o DIU )
'@3x' sufixo para dispositivos de 480 DPI (3 pixels para o DIU )
Um bitmap que se destina a ser exibido como uma polegada quadrada existiria em três versões:
MyImage em 160 pixels quadrados
MyImage@2x.jpg em 320 pixels quadrados
MyImage@3x.jpg em 480 pixels quadrados
O programa deve se referir a esse bitmap como myImage, mas a versão correta é recuperada em tempo de
execução com base na resolução da tela. Quando irrestrita, o bitmap sempre será renderizado em unidades de
160 independentes de dispositivo.
Para o Android, os bitmaps são armazenados em várias subpastas do recursos pasta:
drawable-ldpi (baixo DPI) para dispositivos de 120 DPI (0,75 pixels para o DIU )
drawable-mdpi (médio) para dispositivos de 160 DPI (de 1 pixel para o DIU )
drawable-hdpi (alto) para dispositivos de 240 DPI (1,5 pixels para o DIU )
drawable-xhdpi (muito alta) para dispositivos de 320 DPI (2 pixels para o DIU )
drawable-xxhdpi (muito alta extra) para dispositivos de 480 DPI (3 pixels para o DIU )
drawable-xxxhdpi (três extras altos) para dispositivos de 640 DPI (4 pixels para o DIU )
Para um bitmap que se destina a ser renderizado em uma polegada quadrada, as várias versões do bitmap terão o
mesmo nome, mas um tamanho diferente e ser armazenadas nessas pastas:
drawable-ldpi/myImage em 120 pixels quadrados
drawable-mdpi/myImage em 160 pixels quadrados
drawable-hdpi/myImage em 240 pixels quadrados
drawable-xhdpi/myImage em 320 pixels quadrados
drawable-xxhdpi/myImage em 480 pixels quadrados
drawable-xxxhdpi/myImage em 640 pixels quadrados
O bitmap sempre será renderizado em unidades de 160 independentes de dispositivo. (O modelo de solução do
xamarin. Forms padrão só inclui o hdpi, xhdpi e pastas xxhdpi.)
O projeto UWP dá suporte a um esquema de nomenclatura de bitmap que consiste em um fator de escala em
pixels por unidade independente de dispositivo como uma porcentagem, por exemplo:
MyImage.scale-200.jpg em 320 pixels quadrados
Somente alguns porcentagens são válidas. Programas de exemplo deste livro incluem apenas imagens com
escala 200 sufixos, mas os modelos de solução xamarin. Forms atuais incluem escala 100, escala 125, escala
150, e 400 escala.
Ao adicionar bitmaps para os projetos de plataforma, o ação de compilação deve ser:
iOS: BundleResource
Android: AndroidResource
UWP: conteúdo
O ImageTap exemplo cria dois objetos de tipo de botão consiste Image elementos com um
TapGestureRecognizer instalado. Ele destina-se que os objetos sejam uma polegada quadrada. O Source
propriedade de Image é definido usando OnPlatform e On objetos para fazer referência a nomes de arquivos
potencialmente diferentes nas plataformas. As imagens de bitmap incluem números indicando seu tamanho de
pixel, para que você possa ver quais bitmap de tamanho é recuperado e processado.
Barras de ferramentas e seus ícones
Um dos principais usos de bitmaps de específico da plataforma é a barra de ferramentas do xamarin. Forms, que é
construída, adicionando ToolbarItem objetos para o ToolbarItems coleção definida pelo Page . ToobarItem
deriva MenuItem da qual ela herda algumas propriedades.
O mais importante ToolbarItem propriedades são:
Text para o texto que pode aparecer dependendo da plataforma e Order
Icon do tipo FileImageSource para a imagem que pode aparecer dependendo da plataforma e Order
Order do tipo ToolbarItemOrder , uma enumeração com três membros, Default , Primary , e Secondary .

O número de Primary itens devem ser limitados a três ou quatro. Você deve incluir um Text configuração para
todos os itens. Para a maioria das plataformas, apenas o Primary itens que exigem uma Icon , mas requer o
Windows 8.1 um Icon para todos os itens. Os ícones devem ser 32 unidades independentes de dispositivo
quadradas. O FileImageSource tipo indica que são específicos da plataforma.
O ToolbarItem dispara uma Clicked eventos quando tocada, muito parecido com um Button . ToolbarItem
também dá suporte à Command e CommandParameter propriedades geralmente usadas em conjunto com o MVVM.
(Consulte capítulo 18, MVVM ).
IOS e Android exigem que uma página que exibe uma barra de ferramentas é ser um NavigationPage ou uma
página para onde navegadas por uma NavigationPage . O ToolbarDemo conjuntos de programa a MainPage
propriedade do seu App classe para o NavigationPage construtor com um ContentPage argumento e demonstra
o manipulador de evento e a construção de uma barra de ferramentas.
Imagens de botão
Você também pode usar os bitmaps de específico da plataforma para definir a Image propriedade do Button em
um bitmap de quadrado de unidades de 32 independentes de dispositivo, como demonstrado pelo ButtonImage
exemplo.
NOTE
O uso de imagens nos botões foi aprimorado. Ver através de bitmaps com botões.

Links relacionados
Capítulo 13 de texto completo (PDF )
Exemplos do capítulo 13
Trabalhando com imagens
Usar bitmaps com botões
Resumo do capítulo 14. Layout absoluto
22/04/2019 • 10 minutes to read

baixar o exemplo
Como o StackLayout , AbsoluteLayout deriva Layout<View> e herda um Children propriedade. AbsoluteLayout
implementa um sistema de layout que exige que o programador especificar as posições dos seus filhos e,
opcionalmente, seu tamanho. A posição é especificada pelo canto superior esquerdo do filho em relação ao canto
superior esquerdo do AbsoluteLayout em unidades independentes de dispositivo. AbsoluteLayout também
implementa um posicionamento proporcional e o recurso de dimensionamento.
AbsoluteLayout deve ser considerado como um sistema de layout de finalidade especial a ser usado somente
quando o programador pode impor um tamanho nos filhos (por exemplo, BoxView elementos) ou quando o
tamanho do elemento não afeta o posicionamento dos outros filhos. O HorizontalOptions e VerticalOptions
propriedades não têm efeito nos filhos de um AbsoluteLayout .
Esse capítulo também introduz o recurso importante da anexado propriedades vinculáveis que permitem que as
propriedades definidas em uma classe (nesse caso AbsoluteLayout ) a ser anexado a outra classe (um filho do
AbsoluteLayout ).

AbsoluteLayout no código
Você pode adicionar um filho para o Children coleção de um AbsoluteLayout usando o padrão Add método, mas
AbsoluteLayout também fornece um estendido Add método que permite que você especifique um Rectangle .
Outra Add método requer apenas um Point , caso em que o filho é irrestrito e se dimensiona.
Você pode criar uma Rectangle valor com um construtor que requer quatro valores — as duas primeiras
indicando a posição do canto superior esquerdo do filho em relação ao seu pai e os dois que indica o tamanho do
filho. Ou você pode usar um construtor que requer uma Point e uma Size valor.
Eles Add métodos são demonstrados AbsoluteDemo, quais posições BoxView elementos usando Rectangle
valores e um Label elemento usando apenas um Point valor.
O ChessboardFixed de exemplo usa 32 BoxView elementos para criar o padrão xadrez. O programa oferece o
BoxView tamanho elementos embutidos do quadrado 35 unidades. O AbsoluteLayout tem sua HorizontalOptions
e VerticalOptions definido como LayoutOptions.Center , que faz com que o AbsoluteLayout para ter um tamanho
total do quadrado de 280 unidades.

Propriedades vinculáveis anexadas


Também é possível definir a posição e, opcionalmente, o tamanho de um filho de um AbsoluteLayout depois que
ele foi adicionado para o Children coleção usando o método estático AbsoluteLayout.SetLayoutBounds . O primeiro
argumento é o filho; o segundo é um Rectangle objeto. Você pode especificar que o filho se dimensiona
horizontalmente e/ou verticalmente, definindo valores de largura e altura para o AbsoluteLayout.AutoSize
constante.
O ChessboardDynamic exemplo coloca o AbsoluteLayout em um ContentView com um SizeChanged
manipulador a chamar AbsoluteLayout.SetLayoutBounds em todos os filhos para torná-los tão grandes quanto
possível.
A propriedade associável anexada que AbsoluteLayout define é o campo estático somente leitura do tipo
BindableProperty denominado AbsoluteLayout.LayoutBoundsProperty . Estático AbsoluteLayout.SetLayoutBounds
método é implementado por meio da chamada SetValue no filho com o AbsoluteLayout.LayoutBoundsProperty . O
filho contém um dicionário no qual a propriedade associável anexada e seu valor são armazenados. Durante o
layout, o AbsoluteLayout pode obter esse valor chamando AbsoluteLayout.GetLayoutBounds , que é implementado
com um GetValue chamar.

Dimensionamento proporcional e o posicionamento


AbsoluteLayout implementa um dimensionamento proporcional e o posicionamento do recurso. A classe define
uma segunda associável propriedade anexada LayoutFlagsProperty , com os métodos estáticos relacionados
AbsoluteLayout.SetLayoutFlags e AbsoluteLayout.GetLayoutFlags .

O argumento AbsoluteLayout.SetLayoutFlags e o valor de retorno AbsoluteLayout.GetLayoutFlags é um valor do


tipo AbsoluteLayoutFlags , uma enumeração com os seguintes membros:
None (igual a 0)
XProportional (1 )
YProportional (2 )
PositionProportional (3 )
WidthProportional (4 )
HeightProportional (8 )
SizeProportional (12 )
All (\xFFFFFFFF )

Você pode combinar tudo isso com o C# operador OR de bit a bit.


Com esse conjunto de sinalizadores, determinadas propriedades do Rectangle estrutura dos limites de layout
usada para posicionar e dimensionar o filho são interpretados proporcionalmente.
Quando o WidthProportional sinalizador estiver definido, um Width valor 1 significará que o filho é a mesma
largura que o AbsoluteLayout . Uma abordagem semelhante é usada para a altura.
O posicionamento proporcional considera o tamanho. Quando o XProportional sinalizador estiver definido, o X
propriedade do Rectangle dos limites de layout é proporcional. Um valor de 0 significa que o filho esquerdo do
edge é posicionado na borda esquerda do AbsoluteLayout , mas uma posição 1 significa que a borda direita do
filho seja posicionada na borda direita do AbsoluteLayout , não além da borda direita do AbsoluteLayout quanto
você pensava expec t. Uma X filho horizontalmente em centros de propriedade de 0,5 a AbsoluteLayout .
O ChessboardProportional exemplo demonstra o uso de dimensionamento proporcional e o posicionamento.

Trabalhar com coordenadas proporcionais


Às vezes, é mais fácil pensar de forma diferente de como ele é implementado no posicionamento proporcional a
AbsoluteLayout . Talvez você prefira trabalhar com coordenadas proporcionais em que um X propriedade 1
posiciona a borda esquerda de seu filho (em vez da borda direita) em relação a borda direita do AbsoluteLayout .
Esse esquema alternativo de posicionamento pode ser chamada "coordinates filho fracionários." Você pode
converter de coordenadas fracionários filho para os limites de layout necessárias para AbsoluteLayout usando as
fórmulas a seguir:
layoutBounds.X = (fractionalChildCoordinate.X / (1 - layoutBounds.Width))
layoutBounds.Y = (fractionalChildCoordinate.Y / (1 - layoutBounds.Height))
O ProportionalCoordinateCalc demonstra isso.
AbsoluteLayout e XAML
Você pode usar um AbsoluteLayout em XAML e defina as propriedades de associáveis anexadas nos filhos de um
AbsoluteLayout usando valores de atributo AbsoluteLayout.LayoutBounds e AbsoluteLayout.LayoutFlags . Isso é
demonstrado na AbsoluteXamlDemo e o ChessboardXaml exemplos. O último programa contém 32 BoxView
elementos, mas usa implícito Style que inclui o AbsoluteLayout.LayoutFlags propriedade para manter a marcação
para baixo até um mínimo.
É um atributo em XAML que consiste em um nome de classe, um ponto e um nome de propriedade sempre uma
propriedade associável anexada.

Sobreposições
Você pode usar AbsoluteLayout para construir uma sobreposição, que aborda a página com outros controles,
talvez para proteger o usuário interaja com os controles normais na página.
O SimpleOverlay exemplo demonstra essa técnica e também demonstra a ProgressBar , que exibe a extensão
para o qual um programa foi concluída uma tarefa.

Alguma diversão
O DotMatrixClock exemplo exibe a hora atual com uma exibição simulado matricial de 5, 7. Cada ponto é um
BoxView (há 228 deles) dimensionado e posicionado sobre o AbsoluteLayout .

O BouncingText programa anima dois Label objetos a serem Elástico horizontalmente e verticalmente na tela.

Links relacionados
Capítulo 14 de texto completo (PDF )
Exemplos do capítulo 14
AbsoluteLayout
Propriedades anexadas
Resumo do capítulo 15. A interface interativa
22/04/2019 • 15 minutes to read

baixar o exemplo
Este capítulo explora oito View derivados que permitem a interação com o usuário.

Visão geral do modo de exibição


Xamarin. Forms contém classes que pode ser instanciadas 20 que derivam de View , mas não Layout . Seis delas
foram abordados nos capítulos anteriores:
Label : Capítulo 2. Anatomia de um aplicativo
BoxView : Capítulo 3. Rolagem da pilha
Button : Capítulo 6. Cliques de botão
Image : Capítulo 13. Bitmaps
ActivityIndicator : Capítulo 13. Bitmaps
ProgressBar : Capítulo 14. AbsoluteLayout

As exibições de oito neste capítulo efetivamente permitir que o usuário interagir com tipos de dados básicos do
.NET:

TIPO DE DADOS EXIBIÇÕES

Double Slider , Stepper

Boolean Switch

String Entry , Editor , SearchBar

DateTime DatePicker , TimePicker

Você pode pensar nesses modos de exibição como representações visuais de interativas dos tipos de dados
subjacente. Esse conceito é explorado mais no próximo capítulo capítulo 16. Associação de dados.
As exibições de seis restantes são abordadas nos capítulos a seguir:
WebView : Capítulo 16. Associação de dados
Picker : Capítulo 19. Exibições de coleção
ListView : Capítulo 19. Exibições de coleção
TableView : Capítulo 19. Exibições de coleção
Map : Capítulo 28. Localização e mapas
OpenGLView : Não abordado neste livro (e não há suporte para plataformas do Windows)

Controle deslizante e escalonador


Ambos Slider e Stepper permitir que o usuário escolha um valor numérico de um intervalo. O Slider é um
intervalo contínuo durante o Stepper envolve valores discretos.
Noções básicas do controle deslizante
O Slider é uma barra que representa um intervalo de valores de um mínimo à esquerda até um máximo à direita
horizontal. Ele define três propriedades públicas:
Value do tipo double , o valor de 0 padrão
Minimum do tipo double , o valor de 0 padrão
Maximum do tipo double , o valor de 1 padrão

As propriedades vinculáveis que apoiar essas propriedades Certifique-se de que eles sejam consistentes:
Para todas as três propriedades, o coerceValue método especificado para a propriedade associável garante que
Value entre Minimum e Maximum .
O validateValue método MinimumProperty retorna false se Minimum está sendo definida como um valor
maior que ou igual a Maximum e semelhante para MaximumProperty . Retornando false do validateValue faz
com que o método um ArgumentException a ser gerado.
Slider é acionado o ValueChanged evento com um ValueChangedEventArgs argumento quando o Value alterações
de propriedade, por meio de programação ou quando o usuário manipula o Slider .
O SliderDemo exemplo demonstra o uso simple dos Slider .
Armadilhas comuns
No código e no XAML, o Minimum e Maximum são definidas na ordem em que você especificar. Não se esqueça de
inicializar essas propriedades, de modo que Maximum é sempre maior que Minimum . Se não uma exceção será
lançada.
Inicializando o Slider propriedades podem fazer com que o Value propriedade a ser alterada e o ValueChanged
evento seja acionado. Você deve garantir que o Slider manipulador de eventos não acessar modos de exibição
que ainda não tiver sido criados durante a inicialização da página.
O ValueChanged evento não é acionado durante Slider inicialização, a menos que o Value alterações de
propriedade. Você pode chamar o ValueChanged manipulador diretamente no código.
Seleção de cor do controle deslizante
O RgbSliders programa contém três Slider elementos que permitem que você selecionar uma cor, de forma
interativa, especificando seus valores RGB:

O TextFade exemplo usa dois Slider elementos a ser movido de dois Label elementos em um AbsoluteLayout e
esmaece um para o outro.
A diferença escalonador
O Stepper define as propriedades e eventos como a mesma Slider , mas o Maximum propriedade é inicializada
como 100 e Stepper define uma quarta propriedade:
Increment do tipo double inicializado como 1

Visualmente, o Stepper consiste em dois botões rotulados – e +. Pressionar – diminui Value pela Increment em
um mínimo de Minimum . Pressionar + aumenta Value pela Increment a um máximo de Maximum .

Isso é demonstrado pelo StepperDemo exemplo.

Switch e a caixa de seleção


O Switch permite que o usuário especifique um valor booliano.
Noções básicas do comutador
Visualmente, o Switch consiste em uma alternância que pode ser ativada e ativar. A classe define uma
propriedade:
IsToggled do tipo bool

Switch define um evento:


Toggled acompanhada por uma ToggledEventArgs objeto, disparado quando o IsToggled alterações de
propriedade.
O SwitchDemo programa demonstra o Switch .
Uma caixa de seleção tradicional
Alguns desenvolvedores talvez prefiram mais tradicional CheckBox para o Switch . O
Xamarin.FormsBook.Toolkit biblioteca contém um CheckBox classe que deriva de ContentView . CheckBox é
implementado pelos CheckBox.xaml e CheckBox.xaml.cs arquivos. CheckBox define três propriedades ( Text ,
FontSize , e IsChecked ) e um CheckedChanged eventos.

O CheckBoxDemo demonstra isso CheckBox .

Digitar texto
Xamarin. Forms define três modos de exibição que permitem ao usuário inserir e editar texto:
Entry para uma única linha de texto
Editor para várias linhas de texto
SearchBar para uma única linha de texto para fins de pesquisa.

Entry e Editor derivam InputView , que é derivada de View . SearchBar deriva diretamente de View .
Teclado e foco
Em telefones e tablets sem teclados físicos, o Entry , Editor , e SearchBar todos os elementos fazem com que um
teclado virtual para o pop-up. A presença desse teclado na tela está relacionada ao foco de entrada. Um modo de
exibição deve ter sua IsVisible e IsEnabled propriedades definidas como true para obter o foco de entrada.
Dois métodos, uma propriedade somente leitura e dois eventos estão envolvidos com o foco de entrada. Estes são
definidos pelos VisualElement :
O Focus tenta definir o foco de entrada para um elemento de método e retorna true se for bem-sucedido
O Unfocus método Remove o foco de entrada de um elemento
O IsFocused propriedade somente leitura que indica se o elemento tem foco de entrada
O Focused evento indica quando um elemento obtém o foco de entrada
O Unfocused evento indica quando um elemento perde o foco de entrada

Escolhendo o teclado
O InputView classe da qual Entry e Editor derivar define apenas uma propriedade:
Keyboard do tipo Keyboard

Isso indica o tipo de teclado que é exibido. Alguns teclados são otimizados para URIs ou números.
O Keyboard classe permite definir um teclado com um estático Keyboard.Create método com um argumento do
tipo KeyboardFlags , uma enumeração com os sinalizadores de bit a seguir:
None definido como 0
CapitalizeSentence definido como 1
Spellcheck definido como 2
Suggestions definido como 4
All definido como \xFFFFFFFF

Ao usar o multiline Editor quando se espera que um parágrafo ou mais de texto, chamando Keyboard.Create é
uma boa abordagem para selecionar um teclado. Para a linha única Entry , as seguintes propriedades estáticas de
somente leitura do Keyboard são úteis:
Default
Text
Chat
Url
Email
Telephone
Numeric para números positivos com ou sem um ponto decimal.

O KeyboardTypeConverter permite especificar essas propriedades em XAML, como demonstrado pelo


EntryKeyboards programa.
Propriedades de entrada e eventos
A linha única Entry define as propriedades a seguir:
Text do tipo string , o texto que aparece no Entry
TextColor do tipo Color
FontFamily do tipo string
FontSize do tipo double
FontAttributes do tipo FontAttributes
IsPassword do tipo bool , que faz com que os caracteres a ser mascarado
Placeholder do tipo string , para texto dimly colorido que aparece no Entry antes de qualquer coisa é
digitada
PlaceholderColor do tipo Color

O Entry também define dois eventos:


TextChanged com uma TextChangedEventArgs objeto, acionado sempre que o Text alterações de propriedade
, disparado quando o usuário for concluído e o teclado é descartado. O usuário indica a conclusão de
Completed
uma maneira específica da plataforma
O QuadraticEquations que demonstra esses dois eventos.
A diferença de Editor
O multiline Editor define a mesma Text e Font propriedades como Entry , mas não as outras propriedades.
Editor também define as mesmas duas propriedades Entry .

JustNotes é um programa de anotações em notas de forma livre que salva e restaura o conteúdo do Editor .
O SearchBar
O SearchBar não é derivado de InputView , de modo que ele não tem um Keyboard propriedade. Mas tem todos
os Text , Font , e Placeholder propriedades que Entry define. Além disso, SearchBar define três propriedades
adicionais:
CancelButtonColor do tipo Color
SearchCommand do tipo ICommand para uso com o MVVM e associações de dados
SearchCommandParameter do tipo Object , para uso com SearchCommand

O específico da plataforma Cancelar botão apaga o texto. O SearchBar também tem um botão de pesquisa
específicos da plataforma. Pressionar qualquer um desses botões gera um dos dois eventos que SearchBar define:
TextChanged acompanhada por uma TextChangedEventArgs objeto
SearchButtonPressed

O SearchBarDemo exemplo demonstra o SearchBar .

Seleção de data e hora


O DatePicker e TimePicker exibições implementam controles específicos da plataforma que permitem que o
usuário especifique uma data ou hora.
O DatePicker
DatePicker define quatro propriedades:

MinimumDate do tipo DateTime inicializado para 1 de janeiro de 1900


MaximumDate do tipo DateTime inicializado a 31 de dezembro de 2100
Date do tipo DateTime inicializado para DateTime.Today
Format do tipo string , o .NET inicializada como "d", o padrão de data abreviada, de cadeia de caracteres de
formatação, resultando em uma exibição de data como "7/20/1969" nos EUA.
Você pode definir o DateTime Formatar de propriedades no XAML expressar as propriedades como elementos de
propriedade e usando a cultura invariável data abreviada ("7/20/1969").
O DaysBetweenDates exemplo calcula o número de dias entre duas datas selecionadas pelo usuário.
O TimePicker (ou é um TimeSpanPicker?)
TimePicker define duas propriedades e não há eventos:

Time é do tipo TimeSpan em vez de DateTime , que indica o tempo decorrido desde a meia-noite
Format do tipo string , o .NET inicializada como "t", o padrão de hora abreviada, resultando em uma exibição
de tempo como "1 6:45 PM" de cadeia de caracteres de formatação nos EUA.
O SetTimer programa demonstra como usar o TimePicker para especificar uma hora para um timer. O programa
só funciona se mantê-lo em primeiro plano.
SetTimer também demonstra como usar o DisplayAlert método de Page para exibir uma caixa de alerta.

Links relacionados
Texto completo do capítulo 15 (PDF )
Exemplos do capítulo 15
Slider
Entry
Editor
DatePicker
Resumo do capítulo 16. Associação de dados
12/04/2019 • 14 minutes to read

baixar o exemplo

NOTE
Observações sobre essa página indicam áreas onde o xamarin. Forms foi bifurcado do material apresentado no livro.

Os programadores muitas vezes descobrem escrever manipuladores de eventos que detectam quando uma
propriedade de um objeto foi alterado e usá-lo para alterar o valor de uma propriedade em outro objeto. Esse
processo pode ser automatizado com a técnica de vinculação de dados. Associações de dados geralmente são
definidas em XAML e se tornam parte da definição da interface do usuário.
Com muita frequência, essas associações de dados se conectar a objetos de interface do usuário aos dados
subjacentes. Essa é uma técnica que é explorada mais nos capítulo 18. MVVM. No entanto, as associações de
dados também podem se conectar a dois ou mais elementos de interface do usuário. A maioria dos exemplos
antecipadas de vinculação de dados neste capítulo demonstra essa técnica.

Noções básicas de vinculação


Várias propriedades, métodos e classes envolvidas na associação de dados:
O Binding classe deriva BindingBase e encapsula muitas características de uma associação de dados
O BindingContext propriedade é definida pelo BindableObject classe
O SetBinding método também é definido pela BindableObject classe
O BindableObjectExtensions classe define três adicionais SetBinding métodos

As duas classes a seguir dão suporte a extensões de marcação XAML para associações:
BindingExtension oferece suporte a Binding extensão de marcação
ReferenceExtension oferece suporte a x:Reference extensão de marcação

Duas interfaces envolvidas na associação de dados:


INotifyPropertyChangedno System.ComponentModel namespace é para a implementação de notificação quando
uma propriedade é alterada
IValueConverter é usado para definir classes pequenas que convertem valores de um tipo para outro em
associações de dados
Uma associação de dados se conecta a duas propriedades do mesmo objeto ou (mais comumente) em dois
objetos diferentes. Essas duas propriedades são conhecidas como o fonte e o destino. Em geral, uma alteração na
propriedade de origem faz com que uma alteração ocorra na propriedade de destino, mas, às vezes, a direção é
invertida. Independentemente disso:
o destino propriedade deve ser suportada por um BindableProperty
o origem propriedade geralmente é um membro de uma classe que implementa INotifyPropertyChanged

Uma classe que implementa INotifyPropertyChanged dispara uma PropertyChanged evento quando uma
propriedade de valor é alterado. BindableObject implementa INotifyPropertyChanged e dispara
automaticamente uma PropertyChanged evento quando uma propriedade apoiado por um BindableProperty
valores de alterações, mas você pode escrever suas próprias classes que implementam INotifyPropertyChanged
sem derivar da BindableObject .

Código e XAML
O OpacityBindingCode que demonstra como definir uma associação de dados no código:
A fonte é o Value propriedade de um Slider
O destino é o Opacity propriedade de um Label
Os dois objetos estão conectados, definindo o BindingContext do Label do objeto para o Slider objeto. As
duas propriedades são conectadas por meio da chamada um SetBinding método de extensão no Label fazendo
referência a OpacityProperty propriedade associável e o Value propriedade do Slider expresso como um
cadeia de caracteres.
Manipulando o Slider , em seguida, faz com que o Label para esmaecer e sair do modo de exibição.
O OpacityBindingXaml é o mesmo programa com a vinculação de dados definida em XAML. O
BindingContext do Label é definido como um x:Reference referência de extensão de marcação a Slider e o
Opacity propriedade do Label é definido como o Binding extensão de marcação com seus Path propriedade
fazendo referência a Value propriedade do Slider .

Código-fonte e BindingContext
O BindingSourceCode exemplo mostra uma abordagem alternativa no código. Um Binding objeto é criado,
definindo o Source propriedade para o Slider objeto e o Path a propriedade "Valor". O SetBinding método
BindableObject é chamado no Label objeto.

O Binding construtor também poderia ter sido usado para definir o Binding objeto.
O BindingSourceXaml exemplo mostra a técnica comparável no XAML. O Opacity propriedade do Label é
definido como um Binding extensão de marcação com Path definido como o Value propriedade e Source
definido como um Embedded x:Reference extensão de marcação.
Em resumo, há duas maneiras de fazer referência ao objeto de origem de associação:
Por meio de BindingContext propriedade de destino
Por meio de Source propriedade do Binding próprio objeto

Se ambos forem especificados, o segundo tem precedência. A vantagem do BindingContext é que ela é
propagada por meio da árvore visual. Isso é muito útil se várias propriedades de destino são associadas ao
mesmo objeto de origem.
O WebViewDemo programa demonstra essa técnica com o WebView elemento. Duas Button elementos para
navegar para trás e encaminhará herdam uma BindingContext de seu pai que faz referência a WebView . O
IsEnabled , em seguida, as propriedades dos dois botões têm simples Binding extensões de marcação que
direcionam o botão IsEnabled propriedades com base nas configurações dos CanGoBack e CanGoForward
propriedades somente leitura do WebView .

O modo de ligação
Defina a Mode propriedade do Binding a um membro da BindingMode enumeração:
OneWay para que as alterações na propriedade de origem afetam o destino
OneWayToSource para que as alterações na propriedade de destino afeta a fonte
TwoWay para que as alterações na origem e destino afetam uns aos outros
Default Para usar o DefaultBindingMode especificado quando o destino BindableProperty foi criado. Se
nenhum for especificado, o padrão será OneWay para propriedades vinculáveis normais, e OneWayToSource
para propriedades vinculáveis somente leitura.

NOTE
O BindingMode enumeração agora também inclui OnTime para a aplicação de uma associação somente quando o
contexto de associação é alterado e não quando a propriedade de origem é alterada.

As propriedades que devem ser os destinos das vinculações de dados em cenários do MVVM geralmente têm
uma DefaultBindingMode de TwoWay . Elas são:
Value propriedade de Slider e Stepper
IsToggled propriedade de Switch
Text propriedade de Entry , Editor , e SearchBar
Date propriedade de DatePicker
Time propriedade de TimePicker

O BindingModes exemplo demonstra os modos de quatro ligação com uma associação de dados em que o
destino é o FontSize propriedade de um Label e a origem é o Value propriedade de um Slider . Isso permite
que cada Slider para controlar o tamanho da fonte de correspondente Label . Mas o Slider elementos não
são inicializados, porque o DefaultBindingMode da FontSize é de propriedade OneWay .
O ReverseBinding exemplo define as associações no Value propriedade do Slider referenciando o FontSize
propriedade de cada Label . Isso parece ser com versões anteriores, mas ele funciona melhor em initialzing a
Slider elementos porque o Value propriedade da Slider tem um DefaultBindingMode de TwoWay .

Isso é análogo ao como associações são definidas no MVVM, e você usará esse tipo de associação com
frequência.

Cadeia de caracteres de formatação


Quando a propriedade de destino é do tipo string , você pode usar o StringFormat propriedade definida pelo
BindingBase para converter a fonte para um string . Defina as StringFormat propriedade para um .NET
formatação de cadeia de caracteres que você deseja usar com a estática String.Format formato para exibir o
objeto. Ao usar essa cadeia de caracteres de formatação dentro de uma extensão de marcação, coloque-o entre
aspas simples para que as chaves não ser seja confundidas com uma extensão de marcação incorporado.
O ShowViewValues exemplo demonstra como usar StringFormat em XAML.
O WhatSizeBindings exemplo demonstra como exibir o tamanho da página com associações para o Width e
Height propriedades do ContentPage .

Por que ele é chamado "Caminho"?


O Path propriedade Binding é chamada assim porque ela pode ser uma série de propriedades e indexadores,
separados por pontos. O BindingPathDemos exemplo mostra vários exemplos.

Conversores de valor de associação


Quando as propriedades de origem e destino de uma associação de tipos diferentes, você pode converter entre
os tipos que usam um conversor de associação. Essa é uma classe que implementa o IValueConverter interface e
contém dois métodos: Convert para converter a fonte para o destino, e ConvertBack Para converter o destino
para a origem.
O classe o Xamarin.FormsBook.Toolkit biblioteca é um exemplo para a conversão de um
IntToBoolConverter
int para um bool . Demonstrado pelo ButtonEnabler sample, que permite apenas que o Button se pelo
menos um caractere tenha sido digitado em um Entry .
O BoolToStringConverter classe converte um bool para um string e define duas propriedades para especificar
que o texto deve ser retornado para false e true valores. O BoolToColorConverter é semelhante. O
SwitchText exemplo demonstra como usar esses dois conversores para exibir textos diferentes em cores
diferentes com base em um Switch configuração.
Genérica BoolToObjectConverter pode substituir o BoolToStringConverter e BoolToColorConverter e servir como
um generalizado bool -para-conversor de objeto de qualquer tipo.

Associações e modos de exibição personalizados


Você pode simplificar a controles personalizados usando associações de dados. O NewCheckBox.cs arquivo de
código define Text , TextColor , FontSize , FontAttributes , e IsChecked propriedades, mas não tem lógica para
os elementos visuais do controle. Em vez disso, o NewCheckBox.cs.xaml arquivo contém toda a marcação para
elementos visuais do controle por meio de ligações de dados sobre o Label elementos com base nas
propriedades definidas no arquivo code-behind.
O NewCheckBoxDemo exemplo demonstra o NewCheckBox controle personalizado.

Links relacionados
Capítulo 16 de texto completo (PDF )
Exemplos do capítulo 16
Associação de dados
Resumo do capítulo 17. Domínio da grade
22/04/2019 • 7 minutes to read

baixar o exemplo
O Grid é um mecanismo de layout avançados que organiza seus filhos em linhas e colunas de células. Ao
contrário do HTML semelhante table elemento, o Grid é exclusivamente para fins de layout em vez de
apresentação.

A grade básica
Grid deriva Layout<View> , que define uma Children propriedade que Grid herda. Você pode preencher essa
coleção em XAML ou código.
A grade em XAML
A definição de um Grid no XAML geralmente começa com preenchimento a RowDefinitions e ColumnDefinitions
coleções do Grid com RowDefinition e ColumnDefinition objetos. Isso é como você o número de linhas e colunas
de estabelece o Grid e suas propriedades.
RowDefinition tem um Height propriedade e ColumnDefinition tem um Width propriedade, ambos do tipo
GridLength , uma estrutura.
No XAML, o GridLengthTypeConverterconverte cadeias de caracteres de texto simples em GridLength valores. Nos
bastidores, o GridLengthconstrutor cria o GridLength valor com base em um número e um valor do tipo
GridUnitType , uma enumeração com três membros:
Absolute — a largura ou altura for especificada em unidades independentes de dispositivo (um número em
XAML )
Auto — a altura ou largura é dimensionado automaticamente com base no conteúdo da célula ("Auto" em
XAML )
Star — largura ou altura sobra é alocada proporcionalmente (um número com "*", chamado estrela, em
XAML )
Cada filho do Grid também deve ser atribuído uma linha e coluna (explícita ou implicitamente). Se estende por
linha e coluna spans são opcionais. Essas são todas especificadas usando propriedades vinculáveis anexadas — as
propriedades que são definidas pela Grid mas definidas nos filhos do Grid . Grid define quatro propriedades
estáticas de associáveis anexadas:
RowProperty — a linha de base zero; o padrão é 0
ColumnProperty — a coluna com base em zero; o padrão é 0
RowSpanProperty — o número de linhas filho abrange; o padrão é 1
ColumnSpanProperty — o número de colunas filho abrange; o padrão é 1

No código, um programa pode usar oito métodos estáticos para definir e obter esses valores:
Grid.SetRow e Grid.GetRow
Grid.SetColumn e Grid.GetColumn
Grid.SetRowSpan e Grid.GetRowSpan
Grid.SetColumnSpan e Grid.GetColumnSpan
No XAML você usa os seguintes atributos para definir esses valores:
Grid.Row
Grid.Column
Grid.RowSpan
Grid.ColumnSpan

O SimpleGridDemo exemplo demonstra como criar e inicializar um Grid em XAML.


O Grid herda a Padding propriedade do Layout e define duas propriedades adicionais que fornecem o
espaçamento entre linhas e colunas:
RowSpacing tem um valor padrão de 6
ColumnSpacing tem um valor padrão de 6

O RowDefinitions e ColumnDefinitions coleções não são estritamente necessárias. Caso esteja ausente, o Grid
cria linhas e colunas para o Grid filhos e fornece um padrão a todos eles GridLength de "*" (star).
A grade no código
O GridCodeDemo exemplo demonstra como criar e popular um Grid no código. Você pode definir as
propriedades anexadas para cada filho diretamente ou indiretamente por meio da chamada adicional Add
métodos como Add definidas pelo Grid.IGridList interface.
O gráfico de barras da grade
O GridBarChart exemplo mostra como adicionar vários BoxView elementos a um Grid usando o bulk
AddHorizontal método. Por padrão, esses BoxView elementos têm a mesma largura. A altura de cada BoxView ,
em seguida, pode ser controlado para se parecer com um gráfico de barras.
O Grid no GridBarChart compartilhamentos de exemplo uma AbsoluteLayout pai com inicialmente invisível
Frame . O programa também define uma TapGestureRecognizer em cada BoxView usar o Frame para exibir
informações sobre a barra tocada.
Alinhamento da grade
O GridAlignment exemplo demonstra como usar o VerticalOptions e HorizontalOptions propriedades para
alinhar filhos em um Grid célula.
O SpacingButtons exemplo igualmente espaços Button elementos centralizado em Grid células.
Divisores de célula e bordas
O Grid não inclui um recurso que desenha os divisores de célula ou bordas. No entanto, você pode criar seus
próprios.
O GridCellDividers demonstra como definir linhas adicionais e na coluna especificamente para thin BoxView
elementos para imitar linhas divisórias.
O GridCellBorders programa não cria nenhuma célula adicional, mas em vez disso, se alinha BoxView elementos
em cada célula para simular uma borda da célula.

Exemplos de grade quase reais


O KeypadGrid de exemplo usa um Grid para exibir um teclado numérico:
Respondendo a alterações de orientação
O Grid pode ajudar a estruturar um programa para responder a alterações de orientação. O GridRgbSliders
exemplo demonstra uma técnica que move um elemento entre uma segunda linha de um telefone e orientada a
retrato e a segunda coluna de um telefone com orientação paisagem.
Inicializa o programa Slider elementos a um intervalo de 0 a 255 e ligações de dados usa para exibir o valor dos
controles deslizantes em hexadecimal. Porque o Slider valores flutuantes, ponto e o .NET a cadeia de caracteres
de formatação para hexadecimal funciona somente com números inteiros, uma DoubleToIntConvert classe o
Xamarin.FormsBook.Toolkit biblioteca de Ajuda.

Links relacionados
Capítulo 17 de texto completo (PDF )
Exemplos do capítulo 17
Grade
Resumo do capítulo 18. MVVM
22/04/2019 • 8 minutes to read

baixar o exemplo
Uma das melhores maneiras de projetar um aplicativo é, separando a interface do usuário do código subjacente,
que é chamado, às vezes, o lógica de negócios. Existem diversas técnicas, mas aquele que é destinada a ambientes
baseados em XAML é conhecido como Model-View -ViewModel ou MVVM.

Relações do MVVM
Um aplicativo MVVM tem três camadas:
O modelo fornece dados subjacentes, às vezes, por meio de arquivos ou web acessa
O modo de exibição é a usuário interface de camada de apresentação ou, geralmente implementada em XAML
O ViewModel conecta-se o modelo e o modo de exibição
O modelo é com ignorância de ViewModel e o ViewModel é com ignorância da exibição. Essas três camadas
geralmente se conectar entre si usando os seguintes mecanismos:

Em muitos programas menores (e até mesmo maiores), muitas vezes o modelo está ausente ou sua
funcionalidade é integrada ao ViewModel.

ViewModels e vinculação de dados


Para participar de ligações de dados, um ViewModel deve ser capaz de notificar a exibição quando uma
propriedade de ViewModel foi alterada. O ViewModel faz isso Implementando a INotifyPropertyChanged
interface no System.ComponentModel namespace. Isso faz parte do .NET em vez de xamarin. Forms. (Geralmente
ViewModels tentar manter a independência de plataforma.)
O INotifyPropertyChanged interface declara um evento único chamado PropertyChanged que indica a propriedade
que foi alterado.
Um relógio de ViewModel
O DateTimeViewModel no Xamarin.FormsBook.Toolkit biblioteca define uma propriedade de tipo DateTime que
as alterações com base em um temporizador. A classe implementa INotifyPropertyChanged e dispara o
PropertyChanged evento sempre que o DateTime alterações de propriedade.

O MvvmClock exemplo instancia esse ViewModel e usa as associações de dados ao ViewModel para exibir
informações atualizadas de data e hora.
Propriedades interativas em um ViewModel
Propriedades de uma ViewModel podem ser mais interativas, como demonstrado pelo
SimpleMultiplierViewModel classe, que é parte do SimpleMultiplier exemplo. As associações de dados fornecem
valores multiplicando e multiplicador de duas Slider elementos e exibir o produto com um Label . No entanto,
você pode fazer alterações extensivas essa interface do usuário em XAML sem qualquer alteração resultante no
ViewModel ou o arquivo code-behind.
Um ViewModel de cor
O ColorViewModel no Xamarin.FormsBook.Toolkit biblioteca integra-se a modelos de cores RGB e HSL. Ele é
demonstrado na HslSliders exemplo:

Simplificando o ViewModel
O código em ViewModels pode ser simplificado com a definição de um OnPropertyChanged usando o método de
CallerMemberName atributo, que obtém o nome da propriedade chamada automaticamente. O ViewModelBase
classe os Xamarin.FormsBook.Toolkit biblioteca faz isso e fornece uma classe base para ViewModels.

A interface de comando
MVVM funciona com associações de dados e associações de dados funcionam com propriedades, portanto,
MVVM parece ser deficientes quando se trata de tratamento de um Clicked eventos de um Button ou um
Tapped eventos de um TapGestureRecognizer . Para permitir que ViewModels lidar com tais eventos, xamarin.
Forms dá suporte a interface de comando.
A interface de comando se manifesta no Button com duas propriedades públicas:
Command do tipo ICommand (definido no System.Windows.Input namespace)
CommandParameter do tipo Object

Para dar suporte a interface de comando, um ViewModel deve definir uma propriedade do tipo ICommand que é
então associada a dados para o Command propriedade do Button . O ICommand interface declara dois métodos e
um evento:
Uma Execute método com um argumento de tipo object
Um CanExecute método com um argumento do tipo object que retorna bool
Um CanExecuteChanged evento
Internamente, um ViewModel define cada propriedade do tipo ICommand a uma instância de uma classe que
implementa o ICommand interface. Por meio da associação de dados, o Button inicialmente chama o CanExecute
método e desabilita a mesmo se o método retornar false . Ele também define um manipulador para o
CanExecuteChanged eventos e chamadas CanExecute sempre que esse evento é disparado. Se o Button está
habilitado, ele chama o Execute método sempre que o Button é clicado.
Você pode ter alguns ViewModels, que são anteriores ao xamarin. Forms, e elas talvez já dão suporte à interface
de comando. Para o novo ViewModels se destina a ser usada somente com o xamarin. Forms, xamarin. Forms
fornece um Command classe e uma Command<T> classe que implementam o ICommand interface. O tipo genérico é o
tipo do argumento para o Execute e CanExecute métodos.
Execuções de método simples
O PowersOfThree que demonstra como usar a interface de comando em um ViewModel. O PowersViewModel
classe define duas propriedades do tipo ICommand e também define duas propriedades privadas que ele passa
para o mais simples Command construtor. O programa contém associações de dados desse ViewModel para a
Command propriedades de dois Button elementos.

O Button elementos podem ser facilmente substituídos por TapGestureRecognizer objetos no XAML sem
alterações no código.
Uma calculadora, quase
O AddingMachine exemplo faz uso de ambos os o Execute e CanExecute métodos de ICommand . Ele usa um
AdderViewModel classe os Xamarin.FormsBook.Toolkit biblioteca. O ViewModel contém seis propriedades do
tipo ICommand . Eles são inicializados do Command construtor e Command construtor de Command e o Command<T>
construtor de Command<T> . As chaves numéricas da Calculadora são associadas à propriedade que é inicializada
com Command<T> e uma string argumento Execute e CanExecute identifica a chave particular.

ViewModels e o ciclo de vida do aplicativo


O AdderViewModel usado em de AddingMachine exemplo também define dois métodos chamados SaveState e
RestoreState . Esses métodos são chamados do aplicativo quando ele entra em suspensão e quando ele for
iniciado novamente.

Links relacionados
Capítulo 18 de texto completo (PDF )
Exemplos do capítulo 18
Padrões de aplicativo empresarial usando o livro eletrônico do xamarin. Forms
Resumo do capítulo 19. Exibições de coleção
12/04/2019 • 22 minutes to read

baixar o exemplo

NOTE
Observações sobre essa página indicam áreas onde o xamarin. Forms foi bifurcado do material apresentado no livro.

Xamarin. Forms define três modos de exibição que mantêm as coleções e exibem seus elementos:
Picker é uma lista relativamente curta de itens de cadeia de caracteres que permite ao usuário escolher um
ListView geralmente é uma longa lista de itens normalmente do mesmo tipo e formatação, também
permitindo que o usuário escolha uma
TableView é uma coleção de células (geralmente de vários tipos e aparências) para exibir dados ou gerenciar a
entrada do usuário
É comum que aplicativos MVVM para usar o ListView para exibir uma coleção selecionável de objetos.

Opções do programa com o seletor


O Picker é uma boa opção quando você precisa permitir que o usuário escolha uma opção dentre uma lista
relativamente curta de string itens.
O seletor e a manipulação de eventos
O PickerDemo exemplo demonstra como usar XAML para definir o Picker Title propriedade e adicione
string itens para os Items coleção. Quando o usuário seleciona o Picker , ele exibe os itens a Items coleção
de forma dependente de plataforma.
O SelectedIndexChanged evento indica quando o usuário selecionou um item. O baseado em zero SelectedIndex
propriedade indica, em seguida, o item selecionado. Se nenhum item for selecionado, SelectedIndex é igual a –1.
Você também pode usar SelectedIndex inicializar o item selecionado, mas ele deve ser definido após o Items
coleção é preenchida. No XAML, isso significa que você provavelmente usará um elemento de propriedade para
definir SelectedIndex .
O seletor de vinculação de dados
O SelectedIndex propriedade é feita por uma propriedade vinculável, mas Items for não, isso usando
vinculação de dados com um Picker é difícil. Uma solução é usar o Picker em combinação com um
ObjectToIndexConverter como o Xamarin.FormsBook.Toolkit biblioteca. O PickerBinding demonstra como
isso funciona.

NOTE
O xamarin. Forms Picker agora inclui ItemsSource e SelectedItem propriedades que dão suporte à vinculação de
dados. Ver seletor.

Dados de renderização com ListView


O ListView é a única classe que deriva de ItemsView<TVisual> da qual ela herda o ItemsSource e ItemTemplate
propriedades.
ItemsSource é do tipo IEnumerable mas é null por padrão e deve ser explicitamente inicializados ou (mais
comumente) definido como uma coleção por meio de uma associação de dados. Os itens nesta coleção podem
ser de qualquer tipo.
ListView define uma SelectedItem propriedade que é definido como um dos itens na ItemsSource coleção ou
null se nenhum item está selecionado. ListView é acionado o ItemSelected evento quando um novo item é
selecionado.
Coleções e as seleções
O ListViewList preenchimentos de exemplo uma ListView com 17 Color os valores em um List<Color>
coleção. Os itens são selecionáveis, mas por padrão, eles são exibidos com seus pouco atraente ToString
representações. Vários exemplos neste capítulo mostram como corrigir que exibem e torná-lo tão atraente
conforme desejado.
O separador de linha
No iOS e Android exibe, uma linha fina separa as linhas. Você pode controlar isso com o SeparatorVisibility e
SeparatorColor propriedades. SeparatorVisibility propriedade é do tipo SeparatorVisibility , uma
enumeração com dois membros:
Default , a configuração padrão
None

O item selecionado de vinculação de dados


O SelectedItem propriedade é feita por uma propriedade vinculável, portanto, pode ser a origem ou destino de
uma associação de dados. O padrão BindingMode é OneWayToSource , mas geralmente é o destino de uma
associação de dados bidirecional, especialmente em cenários do MVVM. O ListViewArray que demonstra esse
tipo de associação.
A diferença de ObservableCollection
O ListViewLogger conjuntos de exemplo o ItemsSource propriedade de um ListView para um List<DateTime>
coleção e, em seguida, progressivamente adiciona um novo DateTime objeto à coleção cada segundo usando um
temporizador.
No entanto, o ListView não é atualizado automaticamente em si porque o List<T> coleção não tem um
mecanismo de notificação para indicar quando itens são adicionados ou removidos da coleção.
É uma classe muito melhor para usar em cenários assim ObservableCollection<T> definidos no
System.Collections.ObjectModel namespace. Essa classe implementa a INotifyCollectionChanged interface e,
consequentemente, é acionado uma CollectionChanged evento quando itens são adicionados ou removidos da
coleção, ou quando são substituídos ou movidos dentro do a coleção. Quando o ListView internamente detecta
que uma classe que implementa INotifyCollectionChanged foi definida como sua ItemsSource propriedade, ele
anexa um manipulador para o CollectionChanged eventos e atualiza sua exibição quando a coleção é alterada.
O ObservableLogger exemplo demonstra o uso de ObservableCollection .
Modelos e células
Por padrão, uma ListView exibe os itens em sua coleção, usando cada item ToString método. Uma abordagem
melhor envolve a definição de um modelo para exibir os itens.
Para fazer experiências com esse recurso, você pode usar o NamedColor classe os Xamarin.FormsBook.Toolkit
biblioteca. Essa classe define um estático All propriedade do tipo IList<NamedColor> que contém 141
NamedColor objetos correspondentes aos campos públicos do Color estrutura.
O NaiveNamedColorList conjuntos de exemplo o ItemsSource de um ListView a este NamedColor.All
propriedade, mas somente os nomes de classe totalmente qualificado do NamedColor são objetos exibido.
ListView precisa de um modelo para exibir esses itens. No código, você pode definir as ItemTemplate
propriedade definida pelo ItemsView<TVisual> para um DataTemplate objeto usando o DataTemplate construtor
que faz referência a um derivativo do Cell classe. Cell tem cinco derivados:
TextCell — contém dois Label exibições (conceitualmente)
ImageCell — Adiciona um Image exibir para TextCell
EntryCell — contém um Entry exibir com um Label
SwitchCell — contém um Switch com um Label
ViewCell — pode ser qualquer View (provavelmente com filhos)

Em seguida, chame SetValue e SetBinding no DataTemplate objeto para associar valores com o Cell
propriedades, ou para definir associações de dados no Cell propriedades referenciando propriedades dos itens
no ItemsSource coleção. Isso é demonstrado na TextCellListCode exemplo.
Como cada item é exibido pelo ListView , uma pequena árvore visual é construída a partir do modelo e
associações de dados são estabelecidas entre o item e as propriedades dos elementos nesta árvore visual. Você
pode ter uma ideia desse processo, instalando manipuladores para o ItemAppearing e ItemDisappearing eventos
do ListView , ou usando uma alternativa DataTemplate construtor que usa uma função que é chamada sempre
que a árvore visual de um item deve ser criado.
O TextCellListXaml mostra um programa funcionalmente idêntico inteiramente em XAML. Um DataTemplate
marca é definida como o ItemTemplate propriedade da ListView e, em seguida, o TextCell é definido como o
DataTemplate . Associações às propriedades dos itens na coleção são definidas diretamente na Text e Detail
propriedades do TextCell .
Células personalizadas
No XAML, é possível definir uma ViewCell para o DataTemplate e, em seguida, definir uma árvore visual
personalizada como o View propriedade do ViewCell . ( View é a propriedade content de ViewCell para que o
ViewCell.View marcas não são necessárias.) O CustomNamedColorList que demonstra essa técnica:

Obter o dimensionamento ideal para todas as plataformas pode ser complicado. O RowHeight propriedade é útil,
mas em alguns casos você desejará recorrer ao HasUnevenRows propriedade, que é menos eficiente, mas força o
ListView para as linhas de tamanho. Para iOS e Android, você deve usar uma dessas duas propriedades para
obter o dimensionamento apropriado de linha.
Agrupar os itens de ListView
ListView dá suporte o agrupamento de itens e navegando entre esses grupos. O ItemsSource propriedade deve
ser definida como uma coleção de coleções: O objeto que ItemsSource está definido para deve implementar
IEnumerable , e cada item na coleção também deve implementar IEnumerable . Cada grupo deve incluir duas
propriedades: uma descrição de texto do grupo e uma abreviação de três letras.
O NamedColorGroup classe os Xamarin.FormsBook.Toolkit biblioteca cria sete grupos de NamedColor objetos. O
ColorGroupList exemplo mostra como usar esses grupos com o IsGroupingEnabled propriedade de ListView
definido como true e o GroupDisplayBinding e GroupShortNameBinding propriedades associadas a propriedades
em cada grupo.
Cabeçalhos de grupo personalizado
É possível criar cabeçalhos personalizados para o ListView grupos, substituindo o GroupDisplayBinding
propriedade com o GroupHeaderTemplate definir um modelo para os cabeçalhos.
ListView e interatividade
Geralmente, um aplicativo obtiver a interação do usuário com um ListView anexando um manipulador para o
ItemSelected ou ItemTapped evento, ou definindo uma associação de dados no SelectedItem propriedade. Mas
alguns tipos de célula ( EntryCell e SwitchCell ) permitem a interação do usuário, e também é possível criar
células personalizadas que também interagir com o usuário. O InteractiveListView cria 100 instâncias
ColorViewModel e permite que o usuário altere cada cor usando um trio de Slider elementos. O programa
também usa o ColorToContrastColorConverter no Xamarin.FormsBook.Toolkit.

ListView e o MVVM
ListView desempenha um papel importante em cenários do MVVM. Sempre que um IEnumerable coleção
existe em um ViewModel, geralmente está associado a um ListView . Além disso, os itens na coleção que
normalmente implementam INotifyPropertyChanged para associar com propriedades em um modelo.
Uma coleção de ViewModels
Para explorar isso, o SchoolOfFineArts biblioteca cria várias classes com base em um arquivo de dados XML e
imagens de alunos fictícias esse School fictícia.
O Student classe deriva ViewModelBase . O StudentBody classe é uma coleção de Student objetos e também
deriva de ViewModelBase . O SchoolViewModel baixa o arquivo XML e reúne todos os objetos.
O StudentList programa usa uma ImageCell para exibir os alunos e suas imagens em um ListView :
O ListViewHeader exemplo adiciona um Header propriedade, mas ele é mostrado apenas no Android.
Seleção e o contexto de associação
O SelectedStudentDetail programa associa o BindingContext de um StackLayout para o SelectedItem
propriedade do ListView . Isso permite que o programa para exibir informações detalhadas sobre o aluno
selecionado.
Menus de contexto
Uma célula pode definir um menu de contexto que é implementado de maneira específica da plataforma. Para
criar esse menu, adicione MenuItem objetos para o ContextActions propriedade do Cell .
MenuItem define cinco propriedades:
Text do tipo string
Icon do tipo FileImageSource
IsDestructive do tipo bool
Command do tipo ICommand
CommandParameter do tipo object

O Command e CommandParameter propriedades implicam que o ViewModel para cada item contém métodos para
executar os comandos de menu desejado. Em cenários de não-MVVM MenuItem também define uma Clicked
eventos.
O CellContextMenu demonstra essa técnica. O Command propriedade de cada MenuItem está associado a uma
propriedade do tipo ICommand no Student classe. Defina as IsDestructive propriedade para true para um
MenuItem que remove ou exclui o objeto selecionado.

Variando os elementos visuais


Às vezes, você desejará pequenas variações nos visuais dos itens no ListView com base em uma propriedade.
Por exemplo, quando a média de ponto de nível empresarial de um aluno fica abaixo de 2.0, o
ColorCodedStudents exemplo exibe o nome do aluno em vermelho. Isso é feito por meio do uso de um
conversor de valor de associação ThresholdToObjectConverter , no Xamarin.FormsBook.Toolkit biblioteca.
Atualizando o conteúdo
O ListView dá suporte a um gesto suspenso para atualizar seus dados. O programa deve definir a
IsPullToRefresh propriedade true para habilitar isso. O ListView responde ao gesto suspenso definindo seu
IsRefreshing propriedade a ser true e gerando o Refreshing eventos e (para cenários MVVM ) chamando o
Execute método de seu RefreshCommand propriedade.

Tratamento de código a Refresh evento ou o RefreshCommand , em seguida, atualiza, possivelmente, os dados


exibidos pelo ListView e define IsRefreshing para false .
O RssFeed exemplo demonstra como usar um RssFeedViewModel que implementa RefreshCommand e
IsRefreshing propriedades de associação de dados.

O modo de tabela e suas intenções


Enquanto o ListView geralmente exibe várias instâncias do mesmo tipo, o TableView geralmente se concentra
em fornecer uma interface do usuário para várias propriedades de vários tipos. Cada item está associado com seu
próprio Cell derivados exibindo a propriedade ou fornece uma interface do usuário a ele.
Propriedades e as hierarquias
TableView define apenas quatro propriedades:

Intent do tipo TableIntent , uma enumeração


Root do tipo TableRoot , a propriedade de conteúdo de TableView
RowHeight do tipo int
HasUnevenRows do tipo bool

O TableIntent enumeração indica como você pretende usar o TableView :


Data
Form
Settings
Menu

Esses membros também sugerem alguns usos para o TableView .


Várias outras classes envolvidas na definição de uma tabela:
TableSectionBase é uma classe abstrata que deriva BindableObject e define uma Title propriedade
TableSectionBase<T> é uma classe abstrata que deriva TableSectionBase e implementa IList<T> e
INotifyCollectionChanged

TableSection deriva de TableSectionBase<Cell>

TableRoot deriva de TableSectionBase<TableSection>

Em resumo, tem uma Root propriedade definida como um TableRoot objeto, que é uma coleção de
TableView
TableSection objetos, cada um deles é uma coleção de Cell objetos. Uma tabela com várias seções e cada
seção tem várias células. A própria tabela pode ter um título, e cada seção pode ter um título. Embora TableView
utiliza Cell derivados, ele não faz uso de DataTemplate .
Um formulário prosaico
O EntryForm exemplo define uma PersonalInformation modelo de exibição, torna-se uma instância da qual o
BindingContext do TableView . Cada Cell derivados no seu TableSection , em seguida, pode ter associações a
propriedades do PersonalInformation classe.
Células personalizadas
O ConditionalCells exemplo expande EntryForm. O ProgrammerInformation classe inclui uma propriedade
booleana que rege a aplicabilidade das duas propriedades adicionais. Para essas duas propriedades adicionais, o
programa usa um personalizado PickerCell com base em um PickerCell.xaml e PickerCell.xaml.cs no
Xamarin.FormsBook.Toolkit biblioteca.
Embora o IsEnabled as propriedades dos dois PickerCell elementos associados à propriedade Boolean no
ProgrammerInformation , essa técnica não parece funcionar, que solicita o próximo exemplo.

Seções condicionais
O ConditionalSection exemplo coloca os dois itens que são condicionais na seleção do item booliano em um
separado TableSection . O arquivo code-behind remove essa seção do TableView ou adiciona de volta com base
na propriedade Boolean.
Um menu do modo de tabela
Outro uso de um TableView é um menu. O MenuCommands exemplo demonstra um menu que permite que
você mova um pouco BoxView pela tela.

Links relacionados
Capítulo 19 de texto completo (PDF )
Exemplos do capítulo 19
Seletor
ListView
TableView
Resumo do capítulo 20. E/s assíncrona e de arquivo
12/04/2019 • 15 minutes to read

baixar o exemplo

NOTE
Observações sobre essa página indicam áreas onde o xamarin. Forms foi bifurcado do material apresentado no livro.

Uma interface gráfica do usuário deve responder a eventos de entrada do usuário em sequência. Isso significa que
todo o processamento de eventos de entrada do usuário deve ocorrer em um único thread, geralmente chamado
de thread principal ou o thread de interface do usuário.
Os usuários esperam interfaces gráficas do usuário seja ágil na resposta. Isso significa que um programa deve
processar os eventos de entrada do usuário rapidamente. Se isso não for possível, então o processamento deve
estariam relegado às secundários threads de execução.
Vários programas de exemplo neste livro tem usado o WebRequest classe. Nessa classe de BeginGetResponse
método inicia um thread de trabalho, que chama uma função de retorno de chamada quando ela for concluída. No
entanto, essa função de retorno de chamada é executado no thread de trabalho, para que o programa deve chamar
Device.BeginInvokeOnMainThread método para acessar a interface do usuário.

NOTE
Programas do xamarin. Forms devem usar HttpClient vez WebRequest para acessar arquivos pela internet. HttpClient
dá suporte a operações assíncronas.

Uma abordagem mais moderna para processamento assíncrono está disponível no .NET e c#. Isso envolve a Task
e Task<TResult> classes e outros tipos no System.Threading e System.Threading.Tasks namespaces, bem como o
C# 5.0 async e await palavras-chave. Esse é o que este capítulo se concentra em.

De retornos de chamada para aguardar


O Page própria classe contém três métodos assíncronos para exibir caixas de alerta:
DisplayAlert Retorna um Task objeto
DisplayAlert Retorna um Task<bool> objeto
DisplayActionSheet Retorna um Task<string> objeto

O Task objetos indicam que esses métodos implementam o padrão de assíncrono baseado em tarefas, conhecido
como toque. Eles Task objetos são retornados rapidamente a partir do método. O Task<T> retornar valores
constituem uma "promessa" de um valor do tipo TResult estarão disponíveis quando a tarefa é concluída. O Task
valor retornado indica uma ação assíncrona que será concluída mas sem nenhum valor retornada.
Nesses casos, o Task é concluída quando o usuário fechar a caixa de alerta.
Um alerta com retornos de chamada
O AlertCallbacks exemplo demonstra como manipular Task<bool> retornar objetos e
Device.BeginInvokeOnMainThread chamadas usando os métodos de retorno de chamada.
Um alerta com lambdas
O AlertLambdas exemplo demonstra como usar as funções lambda anônima para manipulação Task e
Device.BeginInvokeOnMainThread chamadas.

Um alerta com await


Uma abordagem mais simples envolve a async e await palavras-chave introduzidas no c# 5. O AlertAwait
demonstra seu uso.
Um alerta com nada
Se o método assíncrono retorna Task em vez de Task<TResult> , em seguida, o programa não precisa usar
qualquer uma dessas técnicas se ele não precise saber quando a tarefa assíncrona é concluída. O NothingAlert
demonstra isso.
Salvando as configurações do programa de forma assíncrona
O SaveProgramChanges exemplo demonstra o uso da SavePropertiesAsync método Application para salvar as
configurações do programa conforme mudam sem substituindo o OnSleep método.
Um temporizador independente de plataforma
É possível usar Task.Delay para criar um temporizador independente de plataforma. O TaskDelayClock
demonstra isso.

Arquivo de entrada/saída
Tradicionalmente, o .NET System.IO namespace tem sido a fonte de suporte de e/s de arquivo. Embora alguns
métodos neste namespace dão suporte a operações assíncronas, a maioria não tem. O namespace também dá
suporte a várias chamadas de método simples que executam funções de e/s de arquivo sofisticados.
Boas e más notícias
Todas as plataformas com suporte do armazenamento local do aplicativo xamarin. Forms suporte —
armazenamento privado para o aplicativo.
As bibliotecas do xamarin. IOS e xamarin. Android incluem uma versão do .NET que Xamarin tem expressamente
personalizados para essas duas plataformas. Isso inclui classes de System.IO que você pode usar para executar e/s
de arquivo com o armazenamento local do aplicativo nessas duas plataformas.
No entanto, se você pesquisar essas System.IO classes em uma PCL do xamarin. Forms, você não encontrá-los. O
problema é o arquivo Microsoft totalmente renovada e/s para a API de tempo de execução do Windows.
Programas direcionados para Windows 8.1, Windows Phone 8.1 e a plataforma Universal do Windows não usa
System.IO para e/s de arquivo.

Isso significa que você precisará usar o DependencyService (discutidos primeiro capítulo 9. Chamadas à API
específicas da plataforma para implementar a e/s de arquivo.

NOTE
Bibliotecas de classe portáteis foram substituídas por bibliotecas .NET Standard 2.0 e dá suporte a .NET Standard 2.0
System.IO tipos para todas as plataformas do xamarin. Forms. Ele não é mais necessário usar um DependencyService
para a maioria das tarefas de e/s de arquivo. Ver tratamento de arquivos no xamarin. Forms uma abordagem mais moderna
para e/s de arquivo.

Uma primeira tentativa de e/s de arquivo de plataforma cruzada


O TextFileTryout exemplo define uma IFileHelper interface para e/s de arquivo e implementações dessa
interface em todas as plataformas. No entanto, as implementações de tempo de execução do Windows não
funcionam com os métodos nessa interface, pois os métodos de e/s de arquivo do Windows Runtime são
assíncronos.
Acomodando a e/s de arquivo de tempo de execução do Windows
Programas em execução com o tempo de execução do Windows usam classes nos Windows.Storage e
Windows.Storage.Streams namespaces para o arquivo de e/s, incluindo o armazenamento local do aplicativo.
Porque a Microsoft determinou que qualquer operação que exigem que mais de 50 milissegundos devem ser
assíncronos para evitar o bloqueio do thread da interface do usuário, esses métodos de e/s de arquivo são
basicamente assíncronos.
O código que demonstra essa nova abordagem será em uma biblioteca para que ele pode ser usado por outros
aplicativos.

Bibliotecas específicas da plataforma


É vantajoso para armazenar código reutilizável em bibliotecas. Isso é, obviamente, mais difícil quando diferentes
partes do código reutilizável destinam-se totalmente diferentes sistemas operacionais.
O Xamarin.FormsBook.Platform solução demonstra uma abordagem. Essa solução contém sete diferentes
projetos:
Xamarin.FormsBook.Platform, uma PCL normal do xamarin. Forms
Xamarin.FormsBook.Platform.iOS, uma biblioteca de classes do iOS
Xamarin.FormsBook.Platform.Android, uma biblioteca de classe do Android
Xamarin.FormsBook.Platform.UWP, uma biblioteca de classes do Windows Universal
Xamarin.FormsBook.Platform.WinRT, um projeto compartilhado para o código que é comum a todas as
plataformas do Windows
Todos os projetos de plataforma individual (com exceção de Xamarin.FormsBook.Platform.WinRT) têm
referências a Xamarin.FormsBook.Platform. Os três projetos do Windows tem uma referência a
Xamarin.FormsBook.Platform.WinRT.
Todos os projetos contêm um estático Toolkit.Init método para garantir que a biblioteca é carregada se não
diretamente, ela é referenciada por um projeto em uma solução de aplicativo do xamarin. Forms.
O Xamarin.FormsBook.Platform projeto contém o novo IFileHelper interface. Todos os métodos têm agora
nomes com Async sufixos e retorno Task objetos.
O Xamarin.FormsBook.Platform.WinRT projeto contém o FileHelper classe para o tempo de execução do
Windows.
O Xamarin.FormsBook.Platform.iOS projeto contém o FileHelper classe para iOS. Esses métodos agora
devem ser assíncronos. Alguns dos métodos usam as versões assíncronas dos métodos definidos no StreamWriter
e StreamReader : WriteAsync e ReadToEndAsync . Outras convertem um resultado para um Task do objeto usando
o FromResult método.
O Xamarin.FormsBook.Platform.Android projeto contém um semelhante FileHelper classe para o Android.
O Xamarin.FormsBook.Platform projeto também contém uma FileHelper que facilita o uso da classe a
DependencyService objeto.

Para usar essas bibliotecas, uma solução de aplicativo deve incluir todos os projetos de
Xamarin.FormsBook.Platform solução e cada um dos projetos de aplicativo devem ter uma referência para a
biblioteca correspondente em Xamarin.FormsBook.Platform.
O TextFileAsync solução demonstra como usar o Xamarin.FormsBook.Platform bibliotecas. Cada um dos
projetos tem uma chamada para Toolkit.Init . O aplicativo faz uso da e/s de arquivo assíncrona funções.
Mantê -lo em segundo plano
Os métodos nas bibliotecas que fazem chamadas para vários métodos assíncronos — como o WriteFileAsync e
ReadFileASync métodos no tempo de execução do Windows FileHelper classe — pode ficar um pouco mais
eficiente usando o ConfigureAwait método para evitar alternar de volta para o thread de interface do usuário.
Não bloquear o thread de interface do usuário!
Às vezes, é tentador para evitar o uso de ContinueWith ou await usando o Result propriedade nos métodos. Isso
deve ser evitado para que ele pode bloquear o thread de interface do usuário ou até mesmo travar o aplicativo.

Seus próprios métodos awaitable


Você pode executar algum código assincronamente passando-a para um dos Task.Run métodos. Você pode
chamar Task.Run dentro de um método assíncrono que lida com a parte da sobrecarga.
Os vários Task.Run padrões são discutidos abaixo.
O conjunto de Mandelbrot básico
Para desenhar o Mandelbrot definido em tempo real, o Xamarin.Forms.Toolkit biblioteca tem um Complex
estrutura semelhante no System.Numerics namespace.
O MandelbrotSet exemplo possui um CalculateMandeblotAsync método em seu arquivo code-behind que calcula
o conjunto de Mandelbrot em preto e branco básico e usa BmpMaker colocá-lo em um bitmap.
Marcação de progresso
Para relatar o progresso de um método assíncrono, você pode criar uma instância de um Progress<T> classe e
definir seu método assíncrono para ter um argumento do tipo IProgress<T> . Isso é demonstrado na
MandelbrotProgress exemplo.
Cancelando o trabalho
Você também pode escrever um método assíncrono para ser cancelável. Começar com uma classe chamada
CancellationTokenSource . O Token propriedade é um valor do tipo CancellationToken . Isso é passado para a
função assíncrona. Um programa chama o Cancel método CancellationTokenSource (geralmente em resposta a
uma ação do usuário) para cancelar a função assíncrona.
O método assíncrono pode verificar periodicamente as IsCancellationRequested propriedade do
CancellationToken e saia se a propriedade for true , ou simplesmente chamar o ThrowIfCancellationRequested
método, no Nesse caso, o método termina com um OperationCancelledException .
O MandelbrotCancellation exemplo demonstra o uso de uma função cancelável.
An MVVM Mandelbrot
O MandelbrotXF exemplo tem uma interface de usuário mais ampla e baseia-se principalmente em um
MandelbrotModel e MandelbrotViewModel classes:
Volta para a web
O WebRequest classe usado em alguns exemplos de usa um protocolo assíncrono antigo, chamado de modelo de
programação assíncrona ou APM. Você pode converter essa classe para o protocolo de toque modernos usando
um dos FromAsync métodos em de TaskFactory classe. O ApmToTap demonstra isso.

Links relacionados
Capítulo 20 de texto completo (PDF )
Capítulo 20 amostras
Trabalhando com arquivos
Resumo do capítulo 21. Transformações
12/04/2019 • 11 minutes to read

baixar o exemplo
Uma exibição do xamarin. Forms é exibida na tela em um local e o tamanho determinado pelo pai, que geralmente
é um Layout ou Layout<View> derivativo. O transformar é um recurso do xamarin. Forms que pode modificar
esse local, tamanho ou orientação até mesma.
Xamarin. Forms dá suporte a três tipos básicos de transformações:
Tradução — Deslocar um elemento horizontal ou verticalmente
Escala — alterar o tamanho de um elemento
Rotação — ativar um elemento em torno de um ponto ou de eixo
No xamarin. Forms, o dimensionamento é isotropic; ele afeta a largura e altura uniformemente. Rotação dá
suporte tanto na superfície bidimensional de tela e no espaço 3D. Não há nenhuma transformação de distorção
(ou absoluta) e nenhuma transformação de matriz generalizado.
Transformações são compatíveis com oito propriedades do tipo double definido pelo VisualElement classe:
TranslationX
TranslationY
Scale
Rotation
RotationX
RotationY
AnchorX
AnchorY

Todas essas propriedades são apoiadas por propriedades associáveis. Eles podem ser destinos de vinculação de
dados e o estilo. Capítulo 22. Animação demonstra como essas propriedades podem ser animadas, mas alguns
exemplos neste capítulo mostram como é possível animá-los usando o xamarin. Forms temporizador.
Transformar propriedades afetam apenas o modo como o elemento é renderizado e fazer não afetam como o
elemento é percebido no layout.

A transformação de conversão
Valores diferentes de zero do TranslationX e TranslationY propriedades Deslocar um elemento horizontalmente
ou verticalmente.
O TranslationDemo programa permite que você pode experimentar com essas propriedades com dois Slider
elementos que controlam o TranslationX e TranslationY propriedades de um Frame . A transformação também
afeta todos os filhos do Frame .
Efeitos de texto
Um uso comum de propriedades de conversão é Deslocar um pouco a renderização de texto. Isso é demonstrado
na TextOffsets exemplo:
Outro efeito é processar várias cópias de um Label se pareça com um bloco 3D, como demonstrado a BlockText
exemplo.
Saltos e animações
O ButtonJump exemplo usa a conversão para mover um Button sempre que ele é tocado, mas a intenção
principal é demonstrar que o Button recebe entrada do usuário no local em que o botão é renderizado.
O ButtonGlide exemplo é semelhante, mas usa um temporizador para animar o Button de um ponto para outro.

A transformação de escala
O Scale transformação pode aumentar ou diminuir o tamanho do elemento renderizado. O valor padrão é 1. Um
valor de 0 faz com que o elemento invisível. Valores negativos fazem com que o elemento seja exibido deve ser
girada 180 graus. O Scale propriedade não afeta a Width ou Height propriedades do elemento. Esses valores
permanecem os mesmos.
Você pode fazer experiências com o Scale propriedade usando o SimpleScaleDemo exemplo.
O ButtonScaler exemplo demonstra a diferença entre Animando o Scale propriedade de um Button e
animação a FontSize propriedade. O FontSize propriedade afeta como o Button é percebida no layout; o Scale
propriedade não faz isso.
O ScaleToSize exemplo calcula uma Scale propriedade que é aplicada a um Label elemento para torná-lo tão
grandes quanto possível e que se encaixe dentro da página.
Ancoragem de dimensionamento
Os elementos reduzidas horizontalmente em três amostras anteriores todos aumentaram ou diminuíram de
tamanho em relação ao centro do elemento. Em outras palavras, o elemento aumenta ou diminui de tamanho
igual em todas as direções. Somente o ponto no centro do elemento permanece no mesmo local durante a
colocação em escala.
Você pode alterar o centro do dimensionamento de definindo a AnchorX e AnchorY propriedades. Essas
propriedades são em relação ao próprio elemento. Para AnchorX , um valor de 0 refere-se para o lado esquerdo do
elemento e 1 refere-se para o lado direito. Da mesma forma para AnchorY , 0 é a parte superior e 1 é a parte
inferior. Ambas as propriedades têm valores padrão de 0,5, que é o centro.
O AnchoredScaleDemo amostra permite que você experimentar o AnchorX e AnchorY propriedades, bem como
a Scale propriedade.
No iOS, com os valores não padrão de AnchorX e AnchorY propriedades são geralmente incompatíveis com as
alterações de orientação do telefone.

A transformação de rotação
O Rotation propriedade é especificada em graus e indica a rotação horária em torno de um ponto do elemento
definido pelo AnchorX e AnchorY . O PlaneRotationDemo lhe permite fazer experiências com essas três
propriedades.
Efeitos de texto girado
O BoxViewCircle exemplo demonstra a matemática necessária para desenhar um círculo usando 64 pequena
girado BoxView elementos.
O RotatedText exemplo exibirá vários Label elementos com a mesma cadeia de caracteres de texto girado
apareçam como spokes.
O CircularText exemplo exibe uma cadeia de caracteres de texto que aparece para encapsular em um círculo.
Um relógio analógico
O Xamarin.FormsBook.Toolkit biblioteca contém um AnalogClockViewModel classe que calcula os ângulos para
mãos de um relógio. Para evitar dependências de plataforma no ViewModel, usa a classe Task.Delay em vez de
um temporizador para localizar um novo DateTime valor.
Também é incluído no Xamarin.FormsBook.Toolkit é um SecondTickConverter classe que implementa
IValueConverter e serve para arredondar um ângulo de segundo para o segundo mais próximo.

O MinimalBoxViewClock usa três girando BoxView elementos para desenhar um relógio analógico.
O BoxViewClock usa BoxView para gráficos mais amplos, incluindo escala marca em torno a face do relógio e
passa ou girar uma pequena distância de suas extremidades:

Além de uma SecondBackEaseConverter classe Xamarin.FormsBook.Toolkit faz com que a mão segundo
apareçam retroceder um pouco antes de Avançar e, em seguida, para mover de volta na posição correta.
Controles deslizantes verticais?
O VerticalSliders exemplo demonstra que Slider elementos pode ser girados 90 graus e continuam a funcionar.
No entanto, é difícil posicionar esses girado Slider elementos porque no layout que elas ainda parecem ser
horizontal.
Rotações 3D que
O RotationX propriedade aparece para girar um elemento em torno de um eixo x 3D para que a parte superior e
inferior do elemento parecem mover na direção ou distante do visualizador. Da mesma forma, o RotationY parece
girar um elemento em torno do eixo y para tornar os lados esquerdo e direito do elemento parecer mover na
direção ou distante do visualizador.
O AnchorX propriedade afeta RotationY , mas não RotationX . O AnchorY propriedade afeta RotationX , mas não
RotationY . Você pode fazer experiências com o ThreeDeeRotationDemo exemplo para explorar as interações
dessas propriedades.
O sistema de coordenadas 3D implicado pelo xamarin. Forms é canhoto. Se você apontar o dedo indicador da mão
esquerda na direção de X crescente coordena (à direita) e o dedo médio na direção de Y crescente coordena (para
baixo), em seguida, seus pontos de thumb na direção de aumentar as coordenadas Z (fora da tela).
Além disso, para qualquer um dos três eixos, se você apontar o polegar esquerdo na direção de aumentar os
valores, em seguida, a curva de seus dedos indica a direção de rotação para ângulos de rotação positivas.

Links relacionados
Capítulo 21 de texto completo (PDF )
Exemplos do capítulo 21
Resumo do capítulo 22. Animação
12/04/2019 • 16 minutes to read

baixar o exemplo
Você já viu que você pode criar suas próprias animações usando o temporizador de xamarin. Forms ou
Task.Delay , mas é geralmente mais fácil usando os recursos de animação fornecidos pelo xamarin. Forms. Três
classes implementam essas animações:
ViewExtensions , a abordagem de alto nível
Animation , mais versátil mas é mais difícil
AnimationExtension , a maioria dos abordagem versátil, de nível inferior

Em geral, as animações direcionar as propriedades que são apoiadas por propriedades associáveis. Isso não é um
requisito, mas essas são as únicas propriedades que reagem dinamicamente às alterações.
Não há nenhuma interface XAML para essas animações, mas você pode integrar as animações em XAML usando
as técnicas discutidas capítulo 23. Gatilhos e comportamentos.

Explorando animações básicas


As funções básicas de animação são métodos de extensão encontrados na ViewExtensions classe. Esses métodos
se aplicam a qualquer objeto que deriva de VisualElement . As animações mais simples de destino as
transformações propriedades discutidas Chapter 21. Transforms .
O AnimationTryout demonstra como o Clicked manipulador de eventos para um Button pode chamar o
RotateTo método de extensão para girar o botão em um círculo.

O RotateTo alterações de método de Rotation propriedade do Button de 0 a 360 ao longo de um quarto de


segundo (por padrão). Se o Button é tocado novamente, no entanto, ela não faz nada porque o Rotation
propriedade já é 360 graus.
Definindo a duração da animação
O segundo argumento para RotateTo é uma duração em milissegundos. Se definido como um valor grande,
tocando o Button durante uma animação inicia um novo início de animação no ângulo atual.
Animações relativas
O RelRotateTo método executa uma rotação relativa, adicionando um valor especificado ao valor existente. Esse
método permite que o Button a ser tocado várias vezes e cada hora aumenta a Rotation propriedade por 360
graus.
Aguardando a animações
Todos os métodos na animação ViewExtensions retornar Task<bool> objetos. Isso significa que você pode definir
uma série de animações sequenciais usando ContinueWith ou await . O bool conclusão valor retornado é false
se a animação é concluída sem interrupção ou true se ela foi cancelada pelo CancelAnimation método, o que
cancela todas as animações iniciadas pela outro método em ViewExtensions que são definidas no mesmo
elemento.
Animações de composição
Você pode misturar aguardadas não aguardado animações e para criar animações de composição. Essas são as
animações no ViewExtensions que se destinam a TranslationX , TranslationY , e Scale propriedades de
transformação:
TranslateTo
ScaleTo
RelScaleTo

Observe que TranslateTo potencialmente afeta ambas as TranslationX e TranslationY propriedades.


Task. WhenAll e whenany
Também é possível gerenciar animações simultâneas usando Task.WhenAll , que sinaliza quando várias tarefas
todas concluíram, e Task.WhenAny , que sinaliza quando o primeiro de vários tarefas foi concluída.
Rotação e âncoras
Ao chamar o ScaleTo , RelScaleTo , RotateTo , e RelRotateTo métodos, você pode definir o AnchorX e AnchorY
propriedades para indicar o Centro de escala e rotação.
O CircleButton demonstra essa técnica, revolução um Button em torno do centro da página.
Funções de easing
Em geral, as animações são lineares de um valor de início para um valor de término. Funções de easing podem
causar animações aumentar ou reduzir a velocidade ao longo de seu curso. O último argumento opcional para os
métodos de animação é do tipo Easing , uma classe que define 11 campos estáticos somente leitura do tipo
Easing :

Linear , o padrão
SinIn , SinOut , e SinInOut
CubicIn , CubicOut , e CubicInOut
BounceIn e BounceOut
SpringIn e SpringOut

O In sufixo indica que o efeito é o início da animação, Out significa que no final, e InOut significa que ele está
no início e no final da animação.
O BounceButton exemplo demonstra o uso de funções de easing.
Suas próprias funções de easing
Você também pode definir a você próprias funções de easing, passando um Func<double, double> para o Easing
construtor. Easing também define uma conversão implícita da Func<double, double> para Easing . O argumento
para a função de easing sempre está no intervalo de 0 a 1 conforme a animação linearmente prossegue do início
ao fim. A função geralmente retorna um valor no intervalo de 0 a 1, mas pode ser rapidamente negativo ou maior
que 1 (como é o caso com o SpringIn e SpringOut funções) ou poderia quebrar as regras, se você souber que
você está fazendo.
O UneasyScale exemplo demonstra uma função de easing personalizada, e CustomCubicEase demonstra
outra.
O SwingButton exemplo também demonstra uma função de easing personalizada e também uma técnica de
alterar o AnchorX e AnchorY propriedades dentro de uma sequência de animações de rotação.
O Xamarin.FormsBook.Toolkit biblioteca tem um JiggleButton classe que usa uma atenuação personalizada a
função jiggle um botão quando ele for clicado. O JiggleButtonDemo exemplo demonstra isso.
Animações de entrada
Um tipo popular de animação ocorre quando uma página é exibida. Uma animação desse tipo pode ser iniciada
na OnAppearing substituir da página. Para essas animações, convém configurar o XAML para como você deseja
que a página apareça depois de a animação e, em seguida, inicializar e animar o layout do código.
O FadingEntrance de exemplo usa o FadeTo método de extensão para aplicar fade-in o conteúdo da página.
O SlidingEntrance de exemplo usa o TranslateTo método de extensão para deslizar o conteúdo da página dos
lados.
O SwingingEntrance de exemplo usa o RotateYTo método de extensão para animar o RotationY propriedade.
Um RotateXTo método também está disponível.
Animações para sempre
Por outro lado, "sempre" animações executado até que o programa é encerrado. Eles geralmente se destina para
fins de demonstração.
O FadingTextAnimation de exemplo usa FadeTo animação de esmaecimento dois pedaços de texto de entrada
e saída.
PalindromeAnimation exibe um palíndromo e, em seguida, sequencialmente gira as letras individuais 180 graus
para que eles sejam cabeça para baixo. Em seguida, a cadeia de caracteres inteira é invertida 180 graus para ler o
mesmo que a cadeia de caracteres original.
O CopterAnimation exemplo gira um simples BoxView helicóptero enquanto revolução-lo em torno do centro
da tela.
RotatingSpokes gira BoxView raios em torno do centro da tela e, em seguida, gira cada spoke em si para criar
padrões interessantes:

No entanto, aumentar progressivamente a Rotation propriedade de um elemento pode não funcionar em longo
prazo, como o RotationBreakdown demonstra.
O SpinningImage de exemplo usa RotateTo , RotateXTo ,e RotateYTo para torná-lo parecer como se um
bitmap é girar no espaço 3D.
Anime a propriedade de limites
O único método de extensão na ViewExtensions ainda não foi demonstrado é LayoutTo , que efetivamente anima
somente leitura Bounds propriedade chamando o Layout método. Normalmente, esse método é chamado pelo
Layout derivativos conforme será discutido Capítulo 26. CustomLayouts.

O LayoutTo método deve ser restrito para fins especiais. O BouncingBox programa usa para compactar e
expandir um BoxView conforme ele Rebate os lados de uma página.
O XamagonXuzzle de exemplo usa LayoutTo mover os blocos em uma implementação da clássico 15-16
quebra-cabeça que exibe uma imagem embaralhada em vez de blocos numerados:

Suas próprias animações awaitable


O TryAwaitableAnimation exemplo cria uma animação awaitable. A classe crucial que pode retornar um Task
é o objeto do método e, quando a animação é concluída de sinal TaskCompletionSource .

Ainda mais a animações


O sistema de animação do xamarin. Forms pode ser um pouco confuso. Além de Easing classe, o sistema de
animação inclui o ViewExtensions , Animation , e AnimationExtension classes.
Classe ViewExtensions
Você já viu ViewExtensions . Ele define nove métodos que retornam Task<bool> e CancelAnimations . Sete de
destino nove métodos propriedades de transformação. Os outros dois são FadeTo , quais destinos de Opacity
propriedade, e LayoutTo , que chama o Layout método.
Classe de animação
O Animation classe tem um construtor com cinco argumentos para definir o retorno de chamada e terminar de
métodos e parâmetros da animação.
Animações filho podem ser adicionadas com Add , Insert , WithConcurrent e a sobrecarga do WithConcurrent .
O objeto de animação é então iniciado com uma chamada para o Commit método.
Classe AnimationExtensions
O AnimationExtensions classe contém principalmente os métodos de extensão. Há várias versões de um Animate
método e genérica Animate método é tão versátil que realmente é a função de animação somente é necessário.

Trabalhando com a classe de animação


O ConcurrentAnimations exemplo demonstra o Animation classe com várias animações diferentes.
Animações filho
O ConcurrentAnimations exemplo também demonstra filho animações que façam usam da (muito semelhante)
Add e Insert métodos.

Além dos métodos de animação de alto nível


O ConcurrentAnimations exemplo também demonstra como executar animações que vão além de
propriedades direcionadas pelo ViewExtensions métodos. Em um exemplo, uma série de períodos de obter maior;
em outro exemplo, um BackgroundColor propriedade é animada.
Mais de seus próprios métodos awaitable
O TranslateTo método ViewExtensions não funciona com o Easing.SpringOut função. Ele é interrompido quando
a saída de easing obtém acima de 1.
O Xamarin.FormsBook.Toolkit biblioteca contém um MoreViewExtensions classe com TranslateXTo e
TranslateYTo métodos de extensão que não têm esse problema, bem como CancelTranslateXTo e
CancelTranslateYTo métodos para cancelar os animações.

O SpringSlidingEntrance demonstra o TranslateXTo método.


O MoreExtensions classe também contém um TranslateXYTo método de extensão que combina a translação de X
e Y, e uma CancelTranslateXYTo método.
Implementando uma animação de Bézier
Também é possível desenvolver uma animação que move um elemento ao longo do caminho de uma spline de
Bézier. O Xamarin.FormsBook.Toolkit biblioteca contém um BezierSpline estrutura que encapsula uma spline
de Bézier e uma BezierTangent enumeração a orientação do controle.
O MoreViewExtensions classe contém um BezierPathTo o método de extensão e um CancelBezierPathTo método.
O BezierLoop exemplo demonstra a animação de um elemento ao longo de um caminho Beizer.

Trabalhando com AnimationExtensions


Um tipo de animação ausente da coleção padrão é uma animação de cor. O problema é que não há nenhuma
maneira certa para interpolar entre dois Color valores. É possível interpolar os valores RGB individuais, mas
apenas como válido é interpolação os valores HSL.
Por esse motivo, o MoreViewExtensions classe os Xamarin.FormsBook.Toolkit biblioteca contém duas Color
métodos de animação: RgbColorAnimation e HslColorAnimation . (Também há dois métodos de cancelamento:
CancelRgbColorAnimation e CancelHslColorAnimation ).

Ambos os métodos fazem uso de ColorAnimation , que executa a animação chamando o extenso genérico
Animate método na AnimationExtensions .

O ColorAnimations exemplo demonstra como usar esses dois tipos de animações de cores.

Estruturar suas animações


Às vezes é útil expressar animações no XAML e usá-los em conjunto com o MVVM. Isso é abordado no próximo
capítulo capítulo 23. Gatilhos e comportamentos.

Links relacionados
Capítulo 22 de texto completo (PDF )
Exemplos do capítulo 22
Animação
Resumo do capítulo 23. Gatilhos e comportamentos
12/04/2019 • 15 minutes to read

baixar o exemplo
Gatilhos e comportamentos são semelhantes, em que eles ambos destinam-se a ser usado nos arquivos XAML
para simplificar as interações do elemento além do uso de associações de dados e estender a funcionalidade de
elementos XAML. Gatilhos e comportamentos quase sempre são usados com objetos de interface do usuário
visual.
Para dar suporte a gatilhos e comportamentos, ambos VisualElement e Style dão suporte a duas propriedades
de coleção:
VisualElement.Triggers e Style.Triggers do tipo IList<TriggerBase>
VisualElement.Behaviors e Style.Behaviors do tipo IList<Behavior>

Gatilhos
Um gatilho é uma condição (uma alteração de propriedade ou o acionamento de um evento) que resulta em uma
resposta (outra alteração de propriedade ou executar códigos). O Triggers propriedade de VisualElement e
Style é do tipo IList<TriggersBase> . TriggerBase é uma classe abstrata da qual derivam de quatro classes
lacradas:
Trigger para respostas com base nas alterações de propriedade
EventTrigger para respostas com base em acionamentos de evento
DataTrigger para respostas com base em associações de dados
MultiTrigger para respostas com base em vários gatilhos

O gatilho é sempre definido no elemento cuja propriedade está sendo alterada pelo gatilho.
O gatilho mais simples
O Trigger verifica se há uma alteração de um valor de propriedade de classe e responde definindo outra
propriedade do mesmo elemento.
Trigger define três propriedades:
Property do tipo BindableProperty
Value do tipo Object
Setters do tipo IList<SetterBase> , a propriedade de conteúdo de Trigger

Além disso, Trigger requer que a seguinte propriedade herdada da TriggerBase ser definido:
TargetType para indicar o tipo do elemento no qual o Trigger está anexado
O Property e Value compõem a condição e o Setters coleção é a resposta. Quando indicado Property tem o
valor indicado por Value , em seguida, a Setter objetos no Setters coleção são aplicadas. Quando o Property
tem um valor diferente, os setters são removidos. Setter define duas propriedades que são os mesmos que as
duas primeiras propriedades de Trigger :
Property do tipo BindableProperty
Value do tipo Object
O EntryPop exemplo demonstra como um Trigger aplicado a um Entry pode aumentar o tamanho do Entry
por meio do Scale propriedade quando o IsFocused propriedade do Entry é true .
Embora não seja comum, o Trigger pode ser definida no código, como o EntryPopCode demonstra.
O StyledTriggers exemplo demonstra como o Trigger pode ser definido em um Style para aplicar a vários
Entry elementos.

Ações de gatilho e animações


Também é possível executar um pouco de código com base em um gatilho. Esse código pode ser uma animação
que tem como destino uma propriedade. Uma maneira comum é usar um EventTrigger , que define duas
propriedades:
Event do tipo string , o nome de um evento
Actions do tipo IList<TriggerAction> , uma lista de ações a serem executadas em resposta.

Para usar isso, você precisa escrever uma classe que deriva de TriggerAction<T> , em geral,
TriggerAction<VisualElement> . Você pode definir as propriedades nessa classe. Elas são propriedades CLR
simples em vez de propriedades vinculáveis porque TriggerAction não deriva de BindableObject . Você deve
substituir a Invoke método é chamado quando a ação é invocada. O argumento é o elemento de destino.
O ScaleAction classe os Xamarin.FormsBook.Toolkit biblioteca é um exemplo. Ele chama o ScaleTo
propriedade para animar o Scale propriedade de um elemento. Porque uma de suas propriedades é do tipo
Easing , o EasingConverter classe permite que você use o padrão Easing campos estáticos em XAML.

O EntrySwell exemplo demonstra como invocar o ScaleAction do EventTrigger objetos que monitora o
Focused e Unfocused eventos.

O CustomEasingSwell exemplo mostra como definir uma função de easing personalizada ScaleAction em um
arquivo code-behind.
Você também pode invocar ações usando um Trigger (distinguished de EventTrigger ). Isso exige que você
esteja ciente de que TriggerBase define duas coleções:
EnterActions do tipo IList<TriggerAction>
ExitActions do tipo IList<TriggerAction>

O EnterExitSwell exemplo demonstra como usar essas coleções.


Mais gatilhos de evento
O ScaleUpAndDownAction classe os Xamarin.FormsBook.Toolkit chamadas para a biblioteca ScaleTo duas vezes
para escalar verticalmente. O ButtonGrowth exemplo usa isso em um controle com estilo EventTrigger para
fornecer comentários visuais quando um Button é pressionado. Essa animação dobrar também é possível usar
duas ações na coleção do tipo DelayedScaleAction
O ShiverAction classe os Xamarin.FormsBook.Toolkit biblioteca define uma ação de shiver personalizável. O
ShiverButtonDemo exemplo demonstra isso.
O NumericValidationAction classe o Xamarin.FormsBook.Toolkit biblioteca é restrita a Entry elementos e
conjuntos do TextColor propriedade para vermelho se o Text propriedade não é um double . O
TriggerEntryValidation exemplo demonstra isso.
Gatilhos de dados
O DataTrigger é semelhante ao Trigger , exceto que, em vez de monitoramento de uma propriedade para
alterações de valor, ele monitora uma associação de dados. Isso permite que uma propriedade em um elemento
para afetar uma propriedade em outro elemento.
DataTrigger define três propriedades:
Binding do tipo BindingBase
Value do tipo Object
Setters do tipo IList<SetterBase>

O GenderColors exemplo requer o SchoolOfFineArt biblioteca e define as cores dos nomes de alunos para azul
ou rosa com base no Sex propriedade:

O ButtonEnabler conjuntos de exemplo o IsEnabled propriedade de um Entry para False se o Length


propriedade do Text propriedade do Entry é igual a 0. Observe que o Text propriedade é inicializada para uma
cadeia de caracteres vazia; por padrão é null e o DataTrigger não funcionará corretamente.
Combinando as condições no MultiTrigger
O MultiTrigger é uma coleção de condições. Quando eles estão todos os true , em seguida, os setters são
aplicadas. A classe define duas propriedades:
Conditions do tipo IList<Condition>
Setters do tipo IList<Setter>

Condition é uma classe abstrata e tem duas classes descendentes:


PropertyCondition , que tem Property e Value propriedades como Trigger
BindingCondition , que tem Binding e Value propriedades como DataTrigger

No ECONDIÇÕES exemplo, um BoxView só é colorido quando quatro Switch elementos são todos ativados.
O OrConditions exemplo demonstra como você pode fazer uma BoxView uma cor quando qualquer de quatro
Switch elementos estão ativados. Isso requer um aplicativo da lei e reverter toda a lógica De Morgan.

Combinando e e ou lógica não é tão fácil e geralmente requer invisível Switch elementos para os resultados
intermediários. O XorConditions exemplo demonstra como um Button pode ser habilitada se qualquer um de
dois Entry elementos têm algum texto digitado, mas não se ambos tiverem algum texto digitado.

Comportamentos
Tudo que você pode fazer com um gatilho, você também pode fazer com um comportamento, mas sempre,
comportamentos exigem uma classe que deriva de Behavior<T> e substitui os dois métodos a seguir:
OnAttachedTo
OnDetachingFrom

O argumento é o elemento que o comportamento é anexado ao. Em geral, o OnAttachedTo método anexa alguns
manipuladores de eventos e OnDetachingFrom desanexa-los. Como essa classe geralmente salva algum estado, ele
geralmente não pode ser compartilhado em um Style .
BehaviorEntryValidation exemplo é semelhante ao TriggerEntryValidation exceto que ele usa um
comportamento — o NumericValidationBehavior classe a Xamarin.FormsBook.Toolkit biblioteca.
Comportamentos com propriedades
Behavior<T> deriva Behavior , que é derivada de BindableObject , portanto, as propriedades associáveis podem
ser definidas em um comportamento. Essas propriedades podem estar ativas em associações de dados.
Isso é demonstrado na EmailValidationDemo programa que faz uso da ValidEmailBehavior classe o
Xamarin.FormsBook.Toolkit biblioteca. ValidEmailBehavior tem uma propriedade associável somente leitura e
serve como uma fonte em associações de dados.
O EmailValidationConv exemplo usa esse mesmo comportamento para exibir outro tipo de indicador para
sinalizar que um endereço de email é válido.
O EmailValidationTrigger exemplo é uma variação no exemplo anterior. ButtonGlide usa um DataTrigger em
combinação com esse comportamento.
Ativa/desativa e caixas de seleção
É possível encapsular o comportamento de um botão de alternância em uma classe, como ToggleBehavior no
Xamarin.FormsBook.Toolkit biblioteca e, em seguida, definir todas as os elementos visuais para alternância
inteiramente em XAML.
O ToggleLabel de exemplo usa o ToggleBehavior com um DataTrigger usar um Label com duas cadeias de
caracteres de texto para alternância.
O FormattedTextToggle exemplo amplia esse conceito, alternando entre dois FormattedString objetos.
O ToggleBase classe o Xamarin.FormsBook.Toolkit deriva de biblioteca ContentView , define uma IsToggled
propriedade e incorpora um ToggleBehavior para alternância lógica. Isso torna mais fácil definir o botão de
alternância em XAML, como demonstrado pelo TraditionalCheckBox exemplo.
O SwitchCloneDemo inclui um SwitchClone classe que deriva de ToggleBase e usa um TranslateAction classe
para construir um botão de alternância que se parece com o xamarin. Forms Switch .
Um RotateAction no Xamarin.FormsBook.Toolkit fornece uma animação usada para fazer uma alavanca
animada no LeverToggle exemplo.
Responder aos toques
Uma desvantagem EventTrigger é que você não é possível anexá-lo para um TapGestureRecognizer para
responder aos toques. Contornar esse problema é a finalidade das TapBehavior no
Xamarin.FormsBook.Toolkit
O BoxViewTapShiver de exemplo usa TapBehavior usar anterior ShiverAction para tocado BoxView elementos.
O ShiverViews exemplo mostra como reduzir a marcação, encapsulando um ShiverView classe.
Botões de opção
O Xamarin.FormsBook.Toolkit library também tem um RadioBehavior classe para fazer os botões de opção
são agrupados por um string nome do grupo.
O RadioLabels programa usa cadeias de caracteres de texto para seu botão de opção. O RadioStyle de exemplo
usa um Style à diferença na aparência entre botões marcadas e desmarcadas. O RadioImages amostra usa
imagens demarcadas seus botões de opção:

O TraditionalRadios exemplo desenha tradicional botões de opção que aparece com um ponto dentro de um
círculo.
Esmaece e orientação
O exemplo final, MultiColorSliders permite que você alterne entre os três modos de seleção de cor diferente
usando botões de opção. As três exibições de fade in e check-out usando um FadeEnableAction no
Xamarin.FormsBook.Toolkit biblioteca.
O programa também responde às alterações na orientação entre retrato e paisagem usando um
GridOrientationBehavior no Xamarin.FormsBook.Toolkit biblioteca.

Links relacionados
Capítulo 23 de texto completo (PDF )
Capítulo 23 amostras
Trabalhar com gatilhos
Comportamentos do Xamarin.Forms
Resumo do capítulo 24. Navegação da página
12/04/2019 • 17 minutes to read

baixar o exemplo
Muitos aplicativos consistem em várias páginas entre os quais o usuário navega. O aplicativo sempre tem um
principal página ou doméstica página, e a partir daí, o usuário navega para outras páginas, que são mantidas em
uma pilha para navegar de volta. Opções adicionais de navegação são abordadas Capítulo 25. Página
variedades.

Páginas modais e sem janela restrita


VisualElement define uma Navigation propriedade do tipo INavigation , que inclui os dois métodos para
navegar até uma nova página a seguir:
PushAsync
PushModalAsync

Os dois métodos aceitam uma Page instância como um argumento e retornam um Task objeto. Os dois
métodos a seguir navegue de volta para a página anterior:
PopAsync
PopModalAsync

Se a interface do usuário tem seu próprio volta botão (como fazem em telefones Android e Windows) não é
necessário para o aplicativo chamar esses métodos.
Embora esses métodos estão disponíveis de qualquer VisualElement , em geral, eles são chamados da Navigation
propriedade da atual Page instância.
Aplicativos geralmente usam páginas modais quando o usuário é solicitado a fornecer algumas informações na
página antes de retornar à página anterior. Páginas que não são restritas às vezes são chamadas sem janela restrita
ou hierárquica. Nada na própria página distingue-o como modal ou sem-modo; é controlado em vez disso, o
método usado para navegar até ele. Para trabalhar em todas as plataformas, uma página modal deve fornecer sua
própria interface do usuário para navegar de volta à página anterior.
O ModelessAndModal amostra permite que você explore a diferença entre as páginas modais e sem janela
restrita. Qualquer aplicativo que usa a navegação de página deve passar a sua página inicial para o NavigationPage
construtor, geralmente no programa App classe. Um gratificação é que você não precisa definir um Padding na
página do iOS.
Você descobrirá que sem janela restrita páginas, a página do Title propriedade é exibida. O iOS, Android e as
plataformas de tablet e área de trabalho do Windows fornecem um elemento de interface do usuário para navegar
de volta para a página anterior. Curso, Android e Windows dispositivos phone têm um padrão volta botão Voltar.
Páginas modais, a página Title não for exibido, e nenhum elemento de interface do usuário é fornecido para
voltar à página anterior. Embora você possa usar o padrão de Android e Windows phone volta botão para
retornar à página anterior, a página modal em outras plataformas deve fornecer seu próprio mecanismo para
voltar.
Transições de página animados
Versões alternativas dos vários métodos de navegação são fornecidas com um segundo argumento booliano que é
definido como true se você quiser que a transição de página para incluir uma animação:
PushAsync
PushModalAsync
PopAsync
PopModalAsync
No entanto, os métodos de navegação de página padrão incluem a animação por padrão, somente são valiosos
para navegar para uma determinada página na inicialização (como discutido no final deste capítulo) ou ao fornecer
sua própria animação de entrada (como discutido em Chapter22. Animação).
Variações de visuais e funcionais
NavigationPage inclui duas propriedades que podem ser definidas quando você instancia a classe no seu App
método:
BarBackgroundColor
BarTextColor

NavigationPage também inclui quatro propriedades vinculáveis anexadas que afetam a página específica no qual
eles são definidos:
SetHasBackButton e GetHasBackButton
SetHasNavigationBar e GetHasNavigationBar
SetBackButtonTitle e GetBackButtonTitle funcionam somente no iOS
SetTitleIcon e GetTitleIcon funcionam no iOS e Android somente

Explorando a mecânica
Os métodos de navegação de página são todos assíncronos e deve ser usados com await . Após a conclusão não
indica que a navegação de página foi concluída, mas apenas que é seguro examinar a pilha de navegação de
página.
Quando uma página navega para outra, a primeira página geralmente recebe uma chamada para seu
OnDisappearing método e a segunda página recebe uma chamada para sua OnAppearing método. Da mesma
forma, quando uma página é retornado para outra, a primeira página recebe uma chamada para seu
OnDisappearing método e a segunda página geralmente obtém uma chamada para seu OnAppearing método. A
ordem dessas chamadas (e a conclusão dos métodos assíncronos que invoca a navegação) é dependente da
plataforma. O uso da palavra "geralmente" nas duas instruções anteriores é devido a navegação de página modal
Android, em que essas chamadas de método não ocorrem.
Além disso, chamadas para o OnAppearing e OnDisappearing métodos não indicam necessariamente a navegação
de página.
O INavigation interface inclui duas propriedades de coleção que permitem que você examinar a pilha de
navegação:
NavigationStack do tipo IReadOnlyList<Page> para a pilha sem janela restrita
ModalStack do tipo IReadOnlyList<Page> para a pilha modal
É mais seguro acessar essas pilhas do Navigation propriedade do NavigationPage (que deve ser a App da classe
MainPage propriedade). Só é seguro examinar essas pilhas depois de concluíram os métodos de navegação de
página assíncrona. O CurrentPage propriedade o NavigationPage não indica a página atual se a página atual for
uma página modal, mas indica em vez disso, a última página sem janela restrita.
O SinglePageNavigation exemplo permite que você explore a navegação de página e as pilhas e os tipos legais
de navegação de página:
Uma página sem janela restrita pode navegar para outra página sem janela restrita ou em uma página modal
Uma página restrita pode navegar somente para outra página modal
Impondo a modalidade
Um aplicativo usa uma página modal quando é necessário obter algumas informações do usuário. O usuário deve
ser proibido de retornar à página anterior até que essa informação é fornecida. No iOS, é fácil fornecer um volta
botão e habilitá-lo somente quando o usuário termina com a página. Mas para dispositivos com Android e
Windows phone, o aplicativo deve substituir a OnBackButtonPressed método e retorne true se o programa tratou
o volta botão em si, conforme demonstrado no o ModalEnforcement exemplo.
O MvvmEnforcement exemplo demonstra como isso funciona em um cenário do MVVM.

Variações de navegação
Se uma determinada página modal pode ser navegada várias vezes, ele deve reter informações para que o usuário
pode editar as informações em vez de digitá-lo em tudo novamente. Você pode lidar com isso, mantendo a
instância específica de página modal, mas uma abordagem melhor (especialmente no iOS ) é preservar as
informações em um modelo de exibição.
Tornando um menu de navegação
O ViewGalleryType exemplo demonstra como usar um TableView para listar itens de menu. Cada item está
associado com um Type objeto para uma determinada página. Quando esse item é selecionado, o programa cria
uma instância de página e navega até ela.

O ViewGalleryInst exemplo é um pouco diferente em que o menu contém instâncias de cada página em vez de
tipos. Isso ajuda a manter as informações de cada página, mas todas as páginas devem ser instanciadas na
inicialização do programa.
Manipulando a pilha de navegação
StackManipulation demonstra as várias funções definidas pelo INavigation que permitem que você manipule a
pilha de navegação de uma maneira estruturada:
RemovePage
InsertPageBefore
PopToRootAsync e PopToRootAsync com animação opcional
Geração de página dinâmica
O BuildAPage exemplo demonstra a construção de uma página em tempo de execução com base na entrada do
usuário.

Padrões de transferência de dados


Geralmente é necessário compartilhar dados entre páginas — para transferir dados para uma página navegada e
para uma página retornar dados para a página que a invocou. Há várias técnicas para fazer isso.
Argumentos de construtor
Ao navegar para uma nova página, é possível instanciar a classe de página com um argumento de construtor que
permite que a página para se inicializar. O SchoolAndStudents demonstra isso. Também é possível para a página
navegada ter seu BindingContext definido por página que navega até ela.
Propriedades e chamadas de método
Os exemplos de transferência de dados restantes exploram o problema de passar informações entre páginas
quando navega de uma página para outra página e vice-versa. Nessas discussões, o doméstica página navega para
o informações da página e deve transferir informações inicializadas para o informações página. O info página
obtém informações adicionais do usuário e transfere as informações para o doméstica página.
O doméstica página pode facilmente acessar métodos públicos e propriedades na informações página assim que
ele cria uma instância dessa página. O info página também pode acessar métodos públicos e propriedades na
doméstica página, mas escolher um bom momento para que isso pode ser complicado. O DateTransfer1 exemplo
faz isso no seu OnDisappearing substituir. Uma desvantagem é que o info precisa saber o tipo de página a
doméstica página.
MessagingCenter
O xamarin. Forms MessagingCenter classe fornece outra maneira para duas páginas para se comunicar entre si. As
mensagens são identificadas por uma cadeia de caracteres de texto e podem ser acompanhadas por qualquer
objeto.
Um programa que deseja receber mensagens de um tipo específico deve se inscrever neles usando
MessagingCenter.Subscribe e especificar uma função de retorno de chamada. Mais tarde pode cancelar assinatura
chamando MessagingCenter.Unsubscribe . A função de retorno de chamada recebe qualquer mensagem enviada do
tipo especificado com o nome especificado, enviado por meio de Send método.
O DateTransfer2 programa demonstra como transferir os dados usando o Centro de mensagens, mas novamente
isso requer que o informações página saber o tipo dos doméstica página.
Eventos
O evento é uma abordagem consagrada pelo tempo para uma classe enviar informações para outra classe sem
saber o tipo dessa classe. No DateTransfer3 exemplo o informações classe define um evento que é acionado
quando as informações estão prontas. No entanto, há um local conveniente para o doméstica página para
desanexar o manipulador de eventos.
O intermediário de classe do aplicativo
O DateTransfer4 exemplo mostra como acessar propriedades definidas no App classe por ambos o inicial página
e o informaçõespágina. Isso é uma boa solução, mas a próxima seção descreve uma opção melhor.
Alternar para um ViewModel
Usando um ViewModel para permite que as informações de doméstica página e o informações página
compartilhar a instância da classe de informações. Isso é demonstrado na DateTransfer5 exemplo.
Salvando e restaurando o estado da página
O App intermediário de classe ou a abordagem de ViewModel é ideal quando o aplicativo deve salvar
informações se o programa entrar em suspensão enquanto o info página está ativa. O DateTransfer6 demonstra
isso.
Salvando e restaurando a pilha de navegação
Em geral, um programa de várias páginas que entra em suspensão deve navegar para a mesma página, quando
ele for restaurado. Isso significa que um programa desse tipo deve salvar o conteúdo da pilha de navegação. Esta
seção mostra como automatizar esse processo em uma classe projetada para essa finalidade. Essa classe também
chama as páginas individuais para permitir que eles salvar e restaurar o estado da página.
O Xamarin.FormsBook.Toolkit biblioteca define uma interface denominada IPersistantPage que classes podem
implementar para salvar e restaurar itens na Properties dicionário.
O MultiPageRestorableApp classe os Xamarin.FormsBook.Toolkit deriva de biblioteca Application . Em seguida,
você pode derivar sua App classe MultiPageRestorableApp e executar um pouco de manutenção.
O StackRestoreDemo demonstra o uso de MultiPageRestorableApp .
Algo como um aplicativo da vida real
O NoteTaker exemplo também usa MultiPageRestorableApp e permite a inserção e a edição de anotações são
salvos no Properties dicionário.

Links relacionados
Capítulo 24 de texto completo (PDF )
Exemplos do capítulo 24
Navegação hierárquica
Páginas modais
Resumo do Capítulo 25. Variedades de página
12/04/2019 • 8 minutes to read

baixar o exemplo
Até agora, você viu duas classes que derivam de Page : ContentPage e NavigationPage . Este capítulo apresenta
dois outros:
MasterDetailPage gerencia duas páginas, um mestre e um detalhe
TabbedPage gerencia várias páginas filho acessadas por meio de guias
Esses tipos de página fornecem opções de navegação mais sofisticadas que o NavagationPage discutidas capítulo
24. Navegação de página.

Mestre e detalhes
O MasterDetailPage define duas propriedades do tipo Page : Master e Detail . Geralmente você define cada
uma dessas propriedades para um ContentPage . O MasterDetailPage exibe e alterna entre essas duas páginas.
Há duas maneiras fundamentais para alternar entre essas duas páginas:
Dividir em que o mestre e detalhes são lado a lado
pop -over onde a página de detalhes aborda ou cobre parcialmente o mestre de página
Há diversas variações do pop -over abordagem (slide, se sobrepõem, e permuta), mas geralmente são plataforma
dependentes. Você pode definir as MasterDetailBehavior propriedade do MasterDetailPage a um membro dos
MasterBehavior enumeração:

Default
Split
SplitOnLandscape
SplitOnPortrait
Popover

No entanto, essa propriedade não tem efeito em telefones. Telefones sempre têm um comportamento de pop-
over. Somente os tablets e desktops windows podem ter um comportamento de divisão.
Explorar os comportamentos
O MasterDetailBehaviors exemplo permite que você pode experimentar com o comportamento padrão em
dispositivos diferentes. O programa contém dois separado ContentPage derivados para o mestre e de detalhes
(com um Title propriedade definida em ambos) e outra classe que deriva de MasterDetailPage que combina-os.
A página de detalhes é colocada entre um NavigationPage porque o programa UWP não funcionará sem ela.
As plataformas Windows 8.1 e Windows Phone 8.1 exigem que um bitmap seja definida como o Icon
propriedade da página mestra.
De volta às aulas
O SchoolAndDetail exemplo adota uma abordagem um pouco diferente para construir o programa para exibir
os alunos do SchoolOfFineArt biblioteca.
O Master e Detail propriedades são definidas com as árvores visuais nos SchoolAndDetailPage.xaml arquivo,
que deriva de MasterDetailPage . Essa organização permite que as associações de dados a ser definido entre as
páginas mestre e de detalhes.
Arquivo XAML também define o IsPresented propriedade do MasterDetailPage para True . Isso faz com que a
página mestra a ser exibida na inicialização; Por padrão, a página de detalhes é exibida. O
SchoolAndDetailPage.xaml.cs arquivo define IsPresented à false quando um item é selecionado do ListView
na página mestra. A página de detalhes, em seguida, é exibida:

Sua própria interface do usuário


Embora o xamarin. Forms fornece uma interface do usuário para alternar entre os modos de exibição mestre e de
detalhes, você pode fornecer seu próprio. Para fazer isso:
Defina a IsGestureEnabled propriedade false para desabilitar o dedo para
Substituir a ShouldShowToolbarButton método e retorne false para ocultar os botões da barra de ferramentas
no Windows 8.1 e Windows Phone 8.1.
É necessário fornecer um meio para alternar entre as páginas mestre e de detalhes, como demonstrado pelo
ColorsDetail exemplo.
O MasterDetailTaps demonstra outra abordagem usando um TapGestureRecognizer nas páginas mestre e de
detalhes.

TabbedPage
O TabbedPage é uma coleção de páginas que você pode alternar entre usando as guias. Ela é derivada da
MultiPage<Page> e define não propriedades públicas nem os métodos do seu próprio. MultiPage<T> , no entanto,
definir uma propriedade:
Children propriedade de tipo IList<T>

Você preenche isso Children coleção com objetos de página.


Outra abordagem permite que você defina as TabbedPage filhos assim como um ListView usando essas duas
propriedades que geram as páginas com guias automaticamente:
ItemsSource do tipo IEnumerable
ItemTemplate do tipo DataTemplate

No entanto, essa abordagem não funciona bem no iOS quando a coleção contém mais de alguns itens.
MultiPage<T> define duas propriedades que permitem que você mantenha o controle de qual página é atualmente
exibida:
CurrentPage do tipo T , fazendo referência à página
SelectedItem do tipo Object , fazendo referência ao objeto no ItemsSource coleção
MultiPage<T> também define dois eventos:
PagesChanged Quando o ItemsSource alterações da coleção
CurrentPageChanged Quando a página exibida é alterado

Páginas de guia discretos


O DiscreteTabbedColors exemplo consiste em três páginas com guias que exibem as cores de três maneiras
diferentes. Cada guia é uma ContentPage derivativo e, em seguida, o TabbedPage derivativo
DiscreteTabbedColorsPage.xaml combina três páginas.
Para cada página que aparece em uma TabbedPage , o Title propriedade é necessária para especificar o texto na
guia e a Apple Store requer que um ícone usado além disso, para que o Icon propriedade é definida para iOS:

O StudentNotes exemplo tem uma home page que lista todos os alunos. Quando um aluno é tocado, navega até
um TabbedPage derivativo, StudentNotesDataPage , que incorpora os três ContentPage objetos na sua árvore visual,
uma delas permite inserir algumas anotações de aluno.
Usando um ItemTemplate
O MultiTabbedColor de exemplo usa o NamedColor classe o Xamarin.FormsBook.Toolkit biblioteca. O
MultiTabbedColorsPage.xaml arquivo define a DataTemplate propriedade do TabbedPage para que começa com
uma árvore visual ContentPage que contém associações a propriedades de NamedColor (incluindo uma associação
para o Title propriedade).
No entanto, isso é problemático no iOS. Apenas alguns dos itens que podem ser exibidos e não há nenhuma boa
maneira de dar a eles ícones.

Links relacionados
Capítulo 25 de texto completo (PDF )
Exemplos do Capítulo 25
Página Master-Detail
Página com guias
Resumo do Capítulo 26. Layouts personalizados
12/04/2019 • 14 minutes to read

baixar o exemplo
Xamarin. Forms inclui várias classes derivadas Layout<View> :
StackLayout ,
Grid ,
AbsoluteLayout ,e
RelativeLayout .

Este capítulo descreve como criar suas próprias classes que derivam de Layout<View> .

Uma visão geral do layout


Não há nenhum sistema centralizado que manipula o layout do xamarin. Forms. Cada elemento é responsável por
determinar qual deve ser seu próprio tamanho e como renderizar em si em uma área específica.
Pais e filhos
Cada elemento que tem filhos é responsável por esses filhos dentro do próprio de posicionamento. É o pai que
determina o tamanho de seus filhos deve ser baseado no tamanho tem disponível e o tamanho do filho quer ser.
Dimensionamento e posicionamento
Layout começa na parte superior da árvore visual com a página e, em seguida, continua por meio de todas as
ramificações. É o método público mais importante no layout Layout definidos por VisualElement . Cada elemento
que é pai de outras chamadas de elementos Layout para cada um dos seus filhos para dar o filho de um tamanho
e posição em relação ao próprio na forma de um Rectangle valor. Eles Layout chamadas propagam através da
árvore visual.
Uma chamada para Layout é necessária para um elemento seja exibido na tela e faz com que as seguintes
propriedades somente leitura a ser definido. Eles são consistentes com o Rectangle passado para o método:
Bounds do tipo Rectangle
X do tipo double
Y do tipo double
Width do tipo double
Height do tipo double

Antes do Layout chamar, Height e Width têm valores fictícios de –1.


Uma chamada para Layout também dispara chamadas para os seguintes métodos protegidos:
SizeAllocated , que chama
OnSizeAllocated , que pode ser substituído.

Por fim, o seguinte evento é acionado:


SizeChanged

O OnSizeAllocated método é substituído por Page e Layout , que são apenas duas classes no xamarin. Forms
que pode ter filhos. As chamadas de método substituído
UpdateChildrenLayout para Page derivativos e UpdateChildrenLayout para Layout derivativos, que chama
LayoutChildren para Page derivativos e LayoutChildren para Layout derivados.
LayoutChildrenem seguida, chama Layout para cada um dos filhos do elemento. Se pelo menos um filho tem
um novo Bounds definindo, em seguida, o seguinte evento é acionado:
LayoutChanged para Page derivativos e LayoutChanged para Layout derivados
Solicitações de tamanho e restrições
Para LayoutChildren chamar inteligentemente Layout em todos os seus filhos, ela deve saber um preferencial ou
desejado tamanho para os filhos. Portanto, as chamadas para Layout para cada um dos filhos são geralmente
precedido por chamadas para
GetSizeRequest

Depois que o livro foi publicado, o GetSizeRequest método foi preterido e substituído por
Measure

O Measure método acomoda a Margin propriedade e inclui um argumento do tipo MeasureFlag , que tem dois
membros:
IncludeMargins
None para não incluir as margens

Para vários elementos, GetSizeRequest ou Measure obtém o tamanho nativo do elemento de seu renderizador. Os
dois métodos têm parâmetros de largura e altura restrições. Por exemplo, um Label usará a restrição de largura
para determinar como encapsular várias linhas de texto.
Ambos GetSizeRequest e Measure retornam um valor do tipo SizeRequest , que tem duas propriedades:
Request do tipo Size
Minimum do tipo Size

Com muita frequência, esses dois valores são iguais e o Minimum valor pode ser geralmente ignorado.
VisualElement também define um método protegido semelhante à GetSizeRequest que é chamado de
GetSizeRequest :

OnSizeRequest Retorna um SizeRequest valor


Agora, esse método é preterido e substituído por:
OnMeasure

Cada classe que deriva de Layout ou Layout<T> deve substituir OnSizeRequest ou OnMeasure . Isso é onde uma
classe de layout determina seu próprio tamanho, o que geralmente se baseia no tamanho de seus filhos, que
obtém chamando GetSizeRequest ou Measure nos filhos. Antes e depois de chamar OnSizeRequest ou OnMeasure ,
GetSizeRequest ou Measure faz ajustes com base nas seguintes propriedades:

WidthRequest do tipo double , afeta a Request propriedade de SizeRequest


HeightRequest do tipo double , afeta a Request propriedade de SizeRequest
MinimumWidthRequest do tipo double , afeta a Minimum propriedade de SizeRequest
MinimumHeightRequest do tipo double , afeta a Minimum propriedade de SizeRequest

Restrições de infinitas
Os argumentos de restrição é passado para GetSizeRequest (ou Measure )e OnSizeRequest (ou OnMeasure ) pode
ser infinito (ou seja, os valores de Double.PositiveInfinity ). No entanto, o SizeRequest retornado com esses
métodos não podem conter dimensões infinitas.
Restrições de infinitas indicam que o tamanho solicitado deve refletir o tamanho do elemento natural. Vertical
StackLayout chamadas GetSizeRequest (ou Measure ) em seus filhos com uma restrição de altura infinito. Um
layout horizontal de pilha de chamadas GetSizeRequest (ou Measure ) em seus filhos com uma restrição de largura
infinita. Uma AbsoluteLayout chamadas GetSizeRequest (ou Measure ) em seus filhos com restrições de largura e
altura infinitos.
Espiar dentro do processo
O ExploreChildSize restrição exibe e tamanho solicitam informações para um layout simples.

Derivando de Layout
Uma classe de layout personalizado deriva Layout<View> . Ele tem duas responsabilidades:
Substituir OnMeasure chamar Measure em filhos de todos do layout. Retornar um tamanho solicitado para o
layout em si
Substituir LayoutChildren chamar Layout em filhos de todos do layout

O for ou foreach loop nessas alternativas deve ignorar qualquer filho cujo IsVisible estiver definida como
false .
Uma chamada para OnMeasure não é garantida. OnMeasure não será chamado se o pai do layout é que regem a
tamanho do layout (por exemplo, um layout que preenche uma página). Por esse motivo, LayoutChildren não
pode contar com tamanhos de filho obtidos durante a OnMeasure chamar. Com muita frequência LayoutChildren
em si deve chamar Measure nos filhos do layout, ou você pode implementar algum tipo de tamanho do cache
lógica (a ser discutido posteriormente).
Um exemplo simples
O VerticalStackDemo exemplo contém um simplificada VerticalStack classe e uma demonstração de seu uso.
Vertical e horizontal de posicionamento simplificado
Um dos trabalhos que VerticalStack deve executar ocorre durante o LayoutChildren substituir. O método usa o
filho HorizontalOptions propriedade para determinar como posicionar o filho dentro de seu slot no
VerticalStack . Em vez disso, você pode chamar o método estático Layout.LayoutChildIntoBoundingRect . Este
método chama Measure sobre o filho e usa seus HorizontalOptions e VerticalOptions propriedades para
posicionar o filho dentro do retângulo especificado.
Invalidação
Geralmente, uma alteração na propriedade de um elemento afeta como esse elemento aparece no layout. O layout
deve ser invalidado para disparar um novo layout.
VisualElement define um método protegido InvalidateMeasure , que é geralmente chamado pelo manipulador de
propriedade alterada de qualquer propriedade associável cuja alteração afeta o tamanho do elemento. O
InvalidateMeasure método dispara uma MeasureInvalidated eventos.

O Layout classe define um método protegido semelhante denominado InvalidateLayout , que um Layout
derivado deve chamar qualquer alteração que afeta como ele posiciona e dimensiona seus filhos.
Algumas regras para layouts de codificação
1. Propriedades definidas por Layout<T> derivativos devem ser feitos por propriedades vinculáveis, e os
manipuladores de propriedade alterada devem chamar InvalidateLayout .
2. Um Layout<T> derivativo que define as propriedades vinculáveis anexadas deve substituir OnAdded para
adicionar um manipulador de propriedade alterada para seus filhos e OnRemoved para remover os
manipulador. O manipulador deve verificar para alterações nesses anexados propriedades vinculáveis e
responder ao chamar InvalidateLayout .
3. Um Layout<T> derivativo que implementa um cache de tamanhos de filho deve substituir
InvalidateLayout e OnChildMeasureInvalidated e limpar o cache quando esses métodos são chamados.

Um layout com propriedades


O WrapLayout classe os Xamarin.FormsBook.Toolkit pressupõe que todos os seus filhos são o mesmo tamanho
e encapsula os filhos de uma linha (ou coluna) para a próxima. Ele define uma Orientation propriedade, como
StackLayout , e ColumnSpacing e RowSpacing propriedades como Grid , e ele armazena em cache em tamanhos de
filho.
O PhotoWrap exemplo coloca um WrapLayout em um ScrollView para a exibição de fotos em estoque.
Nenhuma dimensão irrestrita permitido!
O UniformGridLayout no Xamarin.FormsBook.Toolkit biblioteca destina-se para exibir todos os seus filhos em si
mesmo. Portanto, ele não pode lidar com dimensões irrestritos e gera uma exceção se um for encontrado.
O PhotoGrid demonstra UniformGridLayout :

Sobreposição de filhos
Um Layout<T> derivativo pode se sobrepor a seus filhos. No entanto, os filhos são renderizados em sua ordem na
Children coleta e não a ordem na qual seus Layout métodos são chamados.

O Layout classe define dois métodos que permitem que você mova um filho dentro da coleção:
LowerChild Para mover um filho para o início da coleção
RaiseChild Para mover um filho ao final da coleção
Para os filhos de sobreposição, filhos no final da coleção visualmente aparecem na parte superior de filhos no
início da coleção.
O OverlapLayout classe o Xamarin.FormsBook.Toolkit biblioteca define uma propriedade anexada para indicar
a ordem de renderização e, portanto, permite que um dos seus filhos para ser exibida na parte superior de outras
pessoas. O StudentCardFile demonstra isso:
Mais conectado propriedades vinculáveis
O CartesianLayout classe os Xamarin.FormsBook.Toolkit biblioteca define propriedades vinculáveis anexadas
para especificar duas Point valores e um valor de espessura e manipula BoxView elementos seja semelhante das
linhas.
O UnitCube exemplo utiliza para desenhar um cubo 3D.
Layout e LayoutTo
Um Layout<T> derivativo pode chamar LayoutTo em vez de Layout para animar o layout. O
AnimatedCartesianLayout classe faz isso e o AnimatedUnitCube exemplo demonstra isso.

Links relacionados
Capítulo 26 de texto completo (PDF )
Exemplos do Capítulo 26
Criar Layouts personalizados
Resumo do Capítulo 27. Renderizadores
personalizados
12/04/2019 • 7 minutes to read

baixar o exemplo

NOTE
Observações sobre essa página indicam áreas onde o xamarin. Forms foi bifurcado do material apresentado no livro.

Um elemento de xamarin. Forms, como Button é renderizado com um botão específico da plataforma
encapsulado em uma classe chamada ButtonRenderer . Aqui está o versão iOS de ButtonRenderer , o versão
Android ButtonRenderer e o versão UWP do ButtonRenderer .
Este capítulo discute como você pode escrever seus próprios renderizadores para criar exibições personalizadas
que são mapeadas para objetos específicos da plataforma.

A hierarquia de classe completo


Há quatro assemblies que contêm o código específico da plataforma xamarin. Forms. Você pode exibir o código-
fonte no GitHub usando estes links:
Xamarin.Forms.Platform (muito pequeno)
Xamarin.Forms.Platform.iOS
Xamarin.Forms.Platform.Android
Xamarin.Forms.Platform.UAP

NOTE
O WinRT assemblies mencionados no livro não fazem mais parte dessa solução.

O PlatformClassHierarchy exemplo exibe uma hierarquia de classe para os assemblies que são válidos para a
plataforma em execução.
Você observará uma classe importante chamada ViewRenderer . Esta é a classe que você deriva ao criar um
renderizador específica da plataforma. Existe nas três versões diferentes, pois ele está vinculado ao sistema de
modo de exibição da plataforma de destino:
O iOS ViewRenderer<TView, TNativeView> tem argumentos genéricos:
TView restrito a Xamarin.Forms.View
TNativeView restrito a UIKit.UIView

O Android ViewRenderer<TView, TNativeView> tem argumentos genéricos:


TView restrito a Xamarin.Forms.View
TNativeView restrito a Android.Views.View

A UWP ViewRenderer<TElement, TNativeElement> tem genéricos argumentos nomeados de forma diferente:


TElement restrito a Xamarin.Forms.View
TNativeElement restrito a Windows.UI.Xaml.FrameworkElement

Ao escrever um renderizador, você será derivando uma classe de View e, em seguida, gravar vários ViewRenderer
classes, uma para cada plataforma com suporte. Cada implementação específica da plataforma fará referência a
uma classe nativa que deriva do tipo que você especificar como o TNativeView ou TNativeElement parâmetro.

Olá, renderizadores personalizados!


O HelloRenderers programa faz referência a uma exibição personalizada chamada HelloView no seu App classe.
O HelloView classe está incluída no HelloRenderers do projeto e simplesmente deriva View .
O HelloViewRenderer classe o HelloRenderers.iOS projeto deriva ViewRenderer<HelloView, UILabel> . No
OnElementChanged substituição, ele cria um iOS nativo UILabel e chama SetNativeControl .
O HelloViewRenderer classe o HelloRenderers.Droid projeto deriva ViewRenderer<HelloView, TextView> . No
OnElementChanged substituição, ele cria um Android TextView e chama SetNativeControl .
O HelloViewRendererclasse o HelloRenderers.UWP e outros projetos Windows deriva
ViewRenderer<HelloView, TextBlock> . No OnElementChanged substituição, ele cria um Windows TextBlock e chama
SetNativeControl .

Todos os as ViewRenderer derivativos contêm um ExportRenderer atributo no nível do assembly que associa a
HelloView classe com determinada HelloViewRenderer classe. Isso é como o xamarin. Forms localiza
renderizadores nos projetos de plataforma individual:

Os renderizadores e propriedades
O próximo conjunto de renderizadores implementa o desenho da elipse e está localizado em vários projetos do
Xamarin.FormsBook.Platform solução.
O EllipseView classe está no Xamarin.FormsBook.Platform plataforma. A classe é semelhante à BoxView e
define apenas uma única propriedade: Color do tipo Color .
Os renderizadores podem transferir os valores de propriedade definidos em um View ao objeto nativo por meio
da substituição de OnElementPropertyChanged método em que o renderizador. Dentro desse método (e, na maior
parte do processador), duas propriedades estão disponíveis:
Element , o elemento de xamarin. Forms
Control , o modo nativo ou o objeto de controle ou widget

Os tipos dessas propriedades são determinados pelos parâmetros genéricos para ViewRenderer . Neste exemplo,
Element é do tipo EllipseView .

O OnElementPropertyChanged substituição, portanto, pode transferir a Color valor da Element ao nativo Control
objeto, provavelmente com algum tipo de conversão. Os três renderizadores são:
iOS: EllipseViewRenderer , que usa um EllipseUIView classe para a elipse.
Android: EllipseViewRenderer , que usa um EllipseDrawableView classe para a elipse.
UWP: EllipseViewRenderer , que pode usar o Windows nativo Ellipse classe.
O EllipseDemo classe exibe várias dessas EllipseView objetos:

O BouncingBall bounces um EllipseView desativado os lados da tela.

Os renderizadores e eventos
Também é possível que os renderizadores indiretamente gerar eventos. O StepSlider classe é semelhante ao
xamarin. Forms normal Slider , mas permite especificar um número de etapas separadas entre o Minimum e
Maximum valores.

Os três renderizadores são:


iOS: StepSliderRenderer
Android: StepSliderRenderer
UWP: StepSliderRenderer
Os renderizadores detectar alterações para o controle nativo e, em seguida, chame SetValueFromRenderer , que faz
referência a uma propriedade associável definida no StepSlider , uma alteração que faz com que o StepSlider
acionar um ValueChanged eventos.
O StepSliderDemo que demonstra esse controle deslizante de novo.

Links relacionados
Capítulo 27 de texto completo (PDF )
Exemplos do Capítulo 27
Renderizadores personalizados
Resumo do capítulo 28. Localização e mapas
22/04/2019 • 18 minutes to read

baixar o exemplo

NOTE
Observações sobre essa página indicam áreas onde o xamarin. Forms foi bifurcado do material apresentado no livro.

Xamarin. Forms dá suporte a um Map elemento derivado de View . Por causa dos requisitos de plataforma
especial envolvidos no uso de mapas, eles são implementados em um assembly separado,
Xamarin.Forms.Mapse envolvem um namespace diferente: Xamarin.Forms.Maps .

O sistema de coordenadas geográficas


Um sistema de coordenadas geográficas identifica posições em um objeto esférico (ou quase esférica), como a
Terra. Uma coordenada consiste em dois uma latitude e longitude expressa em ângulos.
Um círculo grande chamado o equator esteja entre os dois polos por meio do qual o eixo da Terra estende
conceitualmente.
Parallels e latitude
Um ângulo medido Norte ou com o Equador no centro das marcas de terra da linhas de latitude igual, conhecido
como parallels. Esses variam de 0 graus no Equador a 90 graus no Centro-Norte e Sul polos. Por convenção, as
latitudes ao norte do Equador são valores positivos e aqueles com Equador são valores negativos.
A longitude e meridianos
Metades do círculos de excelente do polo Norte ao polo Sul são linhas de longitude igual, também conhecido
como meridianos. Eles são relativos do Meridiano de Greenwich, Inglaterra. Por convenção, as longitudes Leste do
Meridiano principal são valores positivos de 0 graus a 180 graus e as longitudes Oeste do Meridiano são valores
negativos de 0 graus para –180 graus.
A projeção equirretangular
Qualquer mapa simples da Terra apresenta distorções. Se todas as linhas de latitude e longitude são retas, e se as
diferenças iguais em ângulos de latitude e longitude corresponderem a mesma distância no mapa, o resultado é
um projeção equirretangular. Este mapa distorce áreas mais próximo para os polos porque eles são esticados
horizontalmente.
A projeção Mercator
A popular projeção Mercator tenta compensar o alongamento horizontal, também dessas áreas de ampliando
verticalmente. Isso resulta em um mapa em que áreas de perto os polos aparecem muito maiores do que
realmente estão, mas nenhuma área local está em conformidade com bastante proximidade com a área real.
Serviços de mapa e blocos
Serviços de mapa usam uma variação da projeção mercador chamada Web Mercator . Os serviços de mapa
fornecem os blocos de bitmap para um cliente com base no local e nível de zoom.

Introdução a localização do usuário


O xamarin. Forms Map classes não incluem um recurso para obter a localização geográfica de usuário, mas isso
geralmente é desejável quando trabalhar com os mapas, portanto, um serviço de dependência deve manipulá-lo.

NOTE
Aplicativos xamarin. Forms em vez disso, podem usar o Geolocation classe incluída no Xamarin.Essentials.

O controlador de local de API


O Xamarin.FormsBook.Platform solução contém o código para um controlador de local de API. O
GeographicLocation estrutura encapsula uma latitude e longitude. O ILocationTracker interface define dois
métodos para iniciar e pausar o rastreador de local e um evento quando um novo local está disponível.
O Gerenciador de localização do iOS
A implementação do iOS dos ILocationTracker é um LocationTracker classe que faz uso de iOS
CLLocationManager .

O Gerenciador local Android


A implementação de Android da ILocationTracker é um LocationTracker classe que faz uso do Android
LocationManager classe.

O localizador de geográfica UWP


A implementação da plataforma Universal do Windows do ILocationTracker é um LocationTracker classe que
faz uso da UWP Geolocator .
Exibir a localização do telefone
O WhereAmI exemplo usa o controlador de local para exibir o local do telefone, em texto e em um mapa
cilíndrica equidistante.
O necessária sobrecarga
Alguma sobrecarga é necessária para WhereAmI usar o controlador de local. Primeiro, todos os projetos na
WhereAmI solução deve ter referências em projetos correspondentes Xamarin.FormsBook.Platforme cada
WhereAmI projeto deve chamar o Toolkit.Init método.
Alguma sobrecarga adicional de específico da plataforma, na forma de permissões de localização, é necessária.
Permissão de localização para iOS
Para iOS, o Info. plist arquivo deve incluir os itens que contêm o texto de uma pergunta perguntando ao usuário
para permitir obtendo local do usuário.
Permissões de localização para Android
Aplicativos Android que obter a localização do usuário devem ter uma permissão de ACCESS_FILE_LOCATION
no arquivo androidmanifest. XML.
Permissões de localização para a UWP
Um aplicativo da plataforma Universal do Windows deve ter um location marcado de funcionalidade do
dispositivo no arquivo Package. appxmanifest.

Trabalhando com Xamarin.Forms.Maps


Vários requisitos que estão envolvidos no uso de Map classe.
O pacote do NuGet
O Xamarin.Forms.Maps NuGet biblioteca deve ser adicionada à solução do aplicativo. O número de versão deve
ser igual a xamarin. Forms pacote atualmente instalado.
Inicializando o pacote de mapas
Os projetos de aplicativo devem chamar o Xamarin.FormsMaps.Init método depois de fazer uma chamada para
Xamarin.Forms.Forms.Init .
Habilitando os serviços de mapa
Porque o Map pode obter a localização do usuário, o aplicativo deve obter permissão para o usuário da maneira
descrita anteriormente neste capítulo:
Habilitar iOS mapeia
Um aplicativo iOS usando Map precisa de duas linhas no arquivo Info. plist.
Habilitando o Android mapeia
Uma chave de autorização é necessária para usar os serviços do Google Maps. Essa chave é inserida na
androidmanifest. XML arquivo. Além disso, o androidmanifest. XML requer o arquivo manifest marcas
envolvidas na obtenção do local do usuário.
Habilitar o UWP é mapeado
Um aplicativo de plataforma Universal do Windows requer uma chave de autorização para usar o Bing Maps. Essa
chave é passada como um argumento para o Xamarin.FormsMaps.Init método. O aplicativo também deve ser
habilitado para serviços de localização.
O mapa não adornado
O MapDemos exemplo consiste em um MapsDemoHomePage.xaml arquivo e MapsDemoHomePage.xaml.cs
arquivo code-behind que permite navegar para vários programas de demonstração.
O BasicMapPage.xaml arquivo mostra como exibir o Map exibição. Por padrão, ele exibe a cidade de Roma, mas o
mapa pode ser manipulado pelo usuário.
Para desativar a rolagem horizontal e vertical, defina as HasScrollEnabled propriedade false . Para desabilitar a
aplicação de zoom, defina HasZoomEnabled para false . Essas propriedades podem não funcionar em todas as
plataformas.
Ruas e terreno
Você pode exibir diferentes tipos de mapas, definindo o Map propriedade MapType do tipo MapType , uma
enumeração com três membros:
Street , o padrão
Satellite
Hybrid

O MapTypesPage.xaml arquivo mostra como usar um botão de opção para selecionar o tipo de mapa. Ele faz uso
do RadioButtonManager classe o Xamarin.FormsBook.Toolkit biblioteca e uma classe com base no
MapTypeRadioButton.xaml arquivo.
Coordenadas do mapa
Um programa pode obter área atual que o Map está exibindo por meio de VisibleRegion propriedade. Esta
propriedade é não apoiada por uma propriedade vinculável, e não há nenhum mecanismo de notificação para
indicar quando ele foi alterado, portanto, um programa que quiser monitorar a propriedade provavelmente deve
usar um timer para essa finalidade.
VisibleRegion é do tipo MapSpan , uma classe com quatro propriedades somente leitura:
Center do tipo Position
LatitudeDegrees do tipo double , que indica a altura da área do mapa exibida
LongitudeDegrees do tipo double , que indica a largura da área do mapa exibida
Radius do tipo Distance , que indica o tamanho da maior área circular visível no mapa

Position e Distance são as duas estruturas. Position define duas propriedades somente leitura definidas por
meio de Position construtor:
Latitude
Longitude

Distance destina-se a fornecer uma unidade independente distância com a conversão entre unidades inglesas e
métrica. Um Distance valor pode ser criado de várias maneiras:
Distance construtor com uma distância em metros
Distance.FromMeters método estático
Distance.FromKilometers método estático
Distance.FromMiles método estático

O valor está disponível em três propriedades:


Meters do tipo double
Kilometers do tipo double
Miles do tipo double

O MapCoordinatesPage.xaml arquivo contém vários Label elementos para exibir o MapSpan informações. O
MapCoordinatesPage.xaml.cs arquivo code-behind usa um temporizador para manter as informações atualizadas
à medida que o usuário manipula o mapa.
Extensões de posição
Uma nova biblioteca para este catálogo denominado Xamarin.FormsBook.Toolkit.Maps contém tipos
específicos do mapa, mas independente de plataforma. O PositionExtensions classe tem um ToString método
para Position e um método para calcular a distância entre dois Position valores.
Configurar um local inicial
Você pode chamar o MoveToRegion método Map para definir programaticamente um local e nível de zoom do
mapa. O argumento é do tipo MapSpan . Você pode criar um MapSpan objeto usando um destes procedimentos:
MapSpan construtor com um e o intervalo de latitude e longitude
Position
MapSpan.FromCenterAndRadius com um Position e radius

Também é possível criar um novo MapSpan de uma já existente, usando os métodos ClampLatitude ou WithZoom .
O WyomingPage.xaml arquivo e WyomingPage.xaml.cs arquivo code-behind demonstra como usar o
MoveToRegion método para exibir o estado do Wyoming.

Como alternativa, você pode usar o Map construtor com um MapSpan objeto para inicializar o local do mapa. O
XamarinHQPage.xaml arquivo mostra como fazer isso inteiramente em XAML para exibir a sede do Xamarin em
são Francisco.
Aumentar o zoom dinâmico
Você pode usar um Slider para ampliar dinamicamente um mapa. O RadiusZoomPage.xaml arquivo e
RadiusZoomPage.xaml.cs arquivo code-behind mostram como alterar o raio de um mapa com base no Slider
valor.
O LongitudeZoomPage.xaml arquivo e LongitudeZoomPage.xaml.cs arquivo code-behind mostram uma
abordagem alternativa que funciona melhor em Android, mas nenhuma das abordagens funciona bem com o
Windows plataformas.
Localização do telefone
O IsShowingUser propriedade do Map funciona um pouco diferente em cada plataforma como o
ShowLocationPage.xaml arquivo demonstra:
No iOS, um ponto azul indica a localização do telefone, mas você deve navegar manualmente existe
No Android, um ícone é exibido que, quando enviada por push move o mapa de localização do telefone
A UWP é semelhante ao iOS, mas, às vezes, automaticamente navega até o local
O MapDemos projeto tenta imitar a abordagem Android primeiro definindo um botão de ícone com base nas
MyLocationButton.xaml arquivo e MyLocationButton.xaml.cs arquivo code-behind.
O GoToLocationPage.xaml arquivo e GoToLocationPage.xaml.cs arquivo code-behind use esse botão para navegar
até a localização do telefone.
PINs e museus ciência
Por fim, o Map classe define um Pins propriedade do tipo IList<Pin> .O Pin classe define quatro propriedades:
Label do tipo string , uma propriedade necessária
Address do tipo string , um endereço legível por humanos opcional
Position do tipo Position , que indica onde o pin é exibido no mapa
Type do tipo PinType , uma enumeração, que não é usada

O MapDemos projeto contém o arquivo ScienceMuseums.xml, que lista museus ciência dos Estados Unidos, e
Locations e Site classes para desserializar dados.

O ScienceMuseumsPage.xaml arquivo e ScienceMuseumsPage.xaml.cs pins de exibição de arquivo de lógica para


esses museus ciência no mapa. Quando o usuário toca um pin, ele exibe o endereço e um site para o Museu.
A distância entre dois pontos
O PositionExtensions classe contém um DistanceTo método com um cálculo simplificado da distância entre dois
locais geográficos.
Isso é usado na LocalMuseumsPage.xaml arquivo e LocalMuseumsPage.xaml.cs arquivo code-behind também
exibir a distância para o Museu de local do usuário:

O programa também demonstra como restringir dinamicamente o número de pins com base na localização do
mapa.

Geocodificação e voltar novamente


O Xamarin.Forms.Maps assembly também contém um Geocoder classe com um GetPositionsForAddressAsync
método converte um endereço de texto em zero ou mais possíveis posições geográficas e outro método
GetAddressesForPositionAsync que converte na outra direção.
O GeocoderRoundTrip.xaml arquivo e GeocoderRoundTrip.xaml.cs arquivo code-behind demonstram esse recurso.

Links relacionados
Capítulo 28 de texto completo (PDF )
Exemplos do capítulo 28
Mapa do xamarin. Forms

Você também pode gostar