Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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.
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.
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.
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:
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.
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.
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.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.
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 :
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.
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.
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.
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.
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 .
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.
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.
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.
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
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.
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.
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.
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.
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
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.
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 .
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.
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.
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
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:
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.
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.
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"
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
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.
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.
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.
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.
As exibições de oito neste capítulo efetivamente permitir que o usuário interagir com tipos de dados básicos do
.NET:
Boolean Switch
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)
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 .
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.
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
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.
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
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.
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 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.
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.
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.
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.
NOTE
O xamarin. Forms Picker agora inclui ItemsSource e SelectedItem propriedades que dão suporte à vinculação de
dados. Ver seletor.
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.
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.
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.
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.
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.
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.
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:
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.
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.
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 GenderColors exemplo requer o SchoolOfFineArt biblioteca e define as cores dos nomes de alunos para azul
ou rosa com base no Sex propriedade:
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.
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.
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:
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>
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
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> .
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 :
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:
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.
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.
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
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.
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:
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.
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 .
NOTE
Aplicativos xamarin. Forms em vez disso, podem usar o Geolocation classe incluída no Xamarin.Essentials.
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 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 programa também demonstra como restringir dinamicamente o número de pins com base na localização do
mapa.
Links relacionados
Capítulo 28 de texto completo (PDF )
Exemplos do capítulo 28
Mapa do xamarin. Forms