Compartilhar via


Resumo do Capítulo 23. Gatilhos e comportamentos

Observação

Este livro foi publicado na primavera de 2016, e não foi atualizado desde então. Há muito no livro que permanece valioso, mas parte do material está desatualizado, e alguns tópicos não estão mais totalmente corretos ou completos.

Os gatilhos e os comportamentos são semelhantes, na medida em que ambos se destinam a ser usados em arquivos XAML para simplificar as interações de elementos além do uso de associações de dados e para estender a funcionalidade de elementos XAML. Tanto os gatilhos quanto os comportamentos são quase sempre usados com objetos visuais da interface do usuário.

Para oferecer suporte a gatilhos e comportamentos, ambos VisualElement e Style suporte a duas propriedades de coleção:

Gatilhos

Um gatilho é uma condição (uma alteração de propriedade ou o disparo de um evento) que resulta em uma resposta (outra alteração de propriedade ou execução de algum código). A Triggers propriedade de VisualElement e Style é do tipo IList<TriggersBase>. TriggerBase é uma classe abstrata da qual derivam quatro classes seladas:

  • Trigger para respostas com base em alterações de propriedade
  • EventTrigger para respostas com base em disparos de eventos
  • DataTrigger para respostas baseadas em associações de dados
  • MultiTrigger para respostas baseadas em vários gatilhos

O gatilho é sempre definido no elemento cuja propriedade está sendo alterada pelo gatilho.

O gatilho mais simples

A Trigger classe verifica se há uma alteração de um valor de propriedade 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 de TriggerBase seja definida:

  • TargetType para indicar o tipo do elemento ao qual o Trigger está ligado

O Property e Value compreendem a condição, e a Setters coleção é a resposta. Quando o indicado Property tem o valor indicado por Value, os Setter objetos na Setters coleção são aplicados. Quando o Property tem um valor diferente, os setters são removidos. Setter define duas propriedades que são iguais às duas primeiras propriedades de Trigger:

O exemplo EntryPop demonstra como um Trigger aplicado a um Entry pode aumentar o tamanho do Entry via da Scale propriedade quando a IsFocused propriedade do Entry é true.

Embora não seja comum, o Trigger pode ser definido em código, como demonstra o exemplo EntryPopCode .

O exemplo StyledTriggers demonstra como o Trigger pode ser definido em um Style para aplicar a vários Entry elementos.

Acionar ações e animações

Também é possível executar um pequeno código com base em um gatilho. Esse código pode ser uma animação destinada a uma propriedade. Uma maneira comum é usar um EventTrigger, que define duas propriedades:

  • Event do tipo string, o nome de um evento
  • Actions do tipo IList<TriggerAction>, uma lista de ações a serem executadas em resposta.

Para usar isso, você precisa escrever uma classe que deriva de TriggerAction<T>, geralmente TriggerAction<VisualElement>. Você pode definir propriedades nessa classe. Essas são propriedades CLR simples em vez de propriedades vinculáveis porque TriggerAction não derivam do BindableObject. Você deve substituir o Invoke método que é chamado quando a ação é chamada. O argumento é o elemento de destino.

A ScaleAction classe na Xamarin.Formsbiblioteca Book.Toolkit é um exemplo. Ele chama a ScaleTo propriedade para animar a Scale propriedade de um elemento. Como uma de suas propriedades é do tipo Easing, a EasingConverter classe permite que você use os campos estáticos padrão Easing em XAML.

O exemplo EntrySwell demonstra como invocar o ScaleAction de EventTrigger objetos que monitoram os Focused eventos e Unfocused .

O exemplo CustomEasingSwell mostra como definir uma função de atenuação personalizada para ScaleAction em um arquivo code-behind.

Você também pode invocar ações usando um Trigger (como distinto de EventTrigger). Isso requer que você esteja ciente de que TriggerBase define duas coleções:

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

Mais gatilhos de eventos

A ScaleUpAndDownAction classe na biblioteca Book.ToolkitXamarin.Forms chama ScaleTo duas vezes para aumentar e diminuir a escala. O exemplo ButtonGrowth usa isso em um estilo EventTrigger para fornecer feedback visual quando um Button é pressionado. Essa animação dupla também é possível usando duas ações na coleção de tipo DelayedScaleAction

A ShiverAction classe na biblioteca Book.Toolkit define uma ação de arrepio Xamarin.Formspersonalizável. O exemplo ShiverButtonDemo demonstra isso.

A NumericValidationAction classe na Xamarin.Formsbiblioteca Book.Toolkit é restrita a Entry elementos e define a TextColor propriedade como vermelha se a Text propriedade não for um doublearquivo . O exemplo TriggerEntryValidation demonstra isso.

Gatilhos de dados

O DataTrigger é semelhante ao Trigger exceto que, em vez de monitorar uma propriedade para alterações de valor, ele monitora uma associação de dados. Isso permite que uma propriedade em um elemento afete uma propriedade em outro elemento.

DataTrigger define três propriedades:

O exemplo GenderColors requer a biblioteca SchoolOfFineArt e define as cores dos nomes dos alunos como azul ou rosa com base na Sex propriedade:

Captura de tela tripla de cores de gênero

O exemplo ButtonEnabler define a IsEnabled propriedade de an Entry como False if a LengthText propriedade da propriedade do igual a Entry 0. Observe que a Text propriedade é inicializada para uma cadeia de caracteres vazia, por padrão é null, e o DataTrigger não funcionaria corretamente.

Combinando condições no MultiTrigger

O MultiTrigger é um conjunto de condições. Quando todos trueeles são , então setters são aplicados. A classe define duas propriedades:

Condition é uma classe abstrata e tem duas classes descendentes:

No exemplo AndConditions, a BoxView só é colorido quando quatro Switch elementos estão todos ativados.

O exemplo OrConditions demonstra como você pode criar uma cor quando qualquer um BoxView dos quatro Switch elementos está ativado. Isso requer uma aplicação da Lei de De Morgan e a inversão de toda a lógica.

Combinar a lógica AND e OR não é tão fácil e geralmente requer elementos invisíveis Switch para resultados intermediários. O exemplo XorConditions demonstra como um pode ser habilitado se um Button dos dois Entry elementos tiver algum texto digitado, mas não se ambos tiverem algum texto digitado.

Comportamentos

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

O argumento é o elemento ao qual o comportamento está ligado. Geralmente, o método anexa OnAttachedTo alguns manipuladores de eventos e OnDetachingFrom os desanexa. Como essa classe geralmente salva algum estado, ela geralmente não pode ser compartilhada em um Stylearquivo .

O exemplo BehaviorEntryValidation é semelhante ao TriggerEntryValidation, exceto que ele usa um comportamento — aXamarin.FormsNumericValidationBehavior classe na biblioteca Book.Toolkit.

Comportamentos com propriedades

Behavior<T> deriva de Behavior, que deriva de BindableObject, de modo que as propriedades vinculáveis podem ser definidas em um comportamento. Essas propriedades podem estar ativas em associações de dados.

Isso é demonstrado no programa EmailValidationDemo que faz uso da ValidEmailBehavior classe naXamarin.Forms biblioteca Book.Toolkit. ValidEmailBehavior tem uma propriedade vinculável somente leitura e serve como uma fonte em associações de dados.

O exemplo EmailValidationConv usa esse mesmo comportamento para exibir outro tipo de indicador para sinalizar que um endereço de email é válido.

O exemplo EmailValidationTrigger é uma variação do exemplo anterior. ButtonGlide usa um DataTrigger em combinação com esse comportamento.

Alternâncias e caixas de seleção

É possível encapsular o comportamento de um botão de alternância em uma classe, como ToggleBehavior na Xamarin.Formsbiblioteca Book.Toolkit, e definir todos os elementos visuais para a alternância inteiramente em XAML.

O exemplo ToggleLabel usa o ToggleBehavior com a DataTrigger para usar um Label com duas cadeias de caracteres de texto para a alternância.

O exemplo FormattedTextToggle estende esse conceito alternando entre dois FormattedString objetos.

A ToggleBase classe na Xamarin.Formsbiblioteca Book.Toolkit deriva de ContentView, define uma IsToggled propriedade e incorpora um ToggleBehavior para a lógica de alternância. Isso facilita a definição do botão de alternância em XAML, conforme demonstrado pelo exemplo TraditionalCheckBox.

O SwitchCloneDemo inclui uma SwitchClone classe que deriva de e usa uma TranslateAction classe para construir um botão de ToggleBase alternância semelhante ao Xamarin.FormsSwitch.

A RotateAction noXamarin.Forms Book.Toolkit fornece uma animação usada para criar uma alavanca animada no exemplo LeverToggle.

Responder a toques

Uma desvantagem é EventTrigger que você não pode anexá-lo a um TapGestureRecognizer para responder a toques. Contornar esse problema é o Xamarin.Formsobjetivo do TapBehavior Book.Toolkit

O exemplo BoxViewTapShiver usa TapBehavior para usar o anterior ShiverAction para elementos tocados BoxView .

O exemplo ShiverViews mostra como reduzir a marcação encapsulando uma ShiverView classe.

Botões de opção

A Xamarin.Formsbiblioteca Book.Toolkit também tem uma RadioBehavior classe para criar botões de opção que são agrupados por um nome de string grupo.

O programa RadioLabels usa cadeias de texto para seu botão de opção. O exemplo RadioStyle usa um Style para a diferença na aparência entre os botões marcados e não marcados. O exemplo RadioImages usa imagens em caixa para seus botões de opção:

Captura de tela tripla de imagens de rádio

A amostra TradicionalRadios desenha botões de opção tradicionais com um ponto dentro de um círculo.

Desvanecimento e orientação

O exemplo final, MultiColorSliders permite que você alterne entre três modos de exibição de seleção de cores diferentes usando botões de opção. Os três modos de exibição entram e saem usando um FadeEnableAction na biblioteca Book.ToolkitXamarin.Forms.

O programa também responde a mudanças na orientação entre retrato e paisagem usando um GridOrientationBehavior na biblioteca Book.Toolkit.Xamarin.Forms