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.
Gatilhos e comportamentos são semelhantes, pois ambos devem ser usados em arquivos XAML para simplificar interações de elemento além do uso de associações de dados e estender a funcionalidade dos elementos XAML. Gatilhos e comportamentos são quase sempre usados com objetos visuais de interface do usuário.
Para dar suporte a gatilhos e comportamentos, e VisualElement
dão Style
suporte a duas propriedades de coleção:
VisualElement.Triggers
eStyle.Triggers
do tipoIList<TriggerBase>
VisualElement.Behaviors
eStyle.Behaviors
do tipoIList<Behavior>
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 quatro classes seladas derivam:
Trigger
para respostas com base em alterações de propriedadeEventTrigger
para respostas com base em disparos de eventosDataTrigger
para respostas com base em associações de dadosMultiTrigger
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
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 tipoBindableProperty
Value
do tipoObject
Setters
do tipoIList<SetterBase>
, a propriedade de conteúdo deTrigger
Além disso, Trigger
requer que a seguinte propriedade herdada de TriggerBase
seja definida:
TargetType
para indicar o tipo do elemento no qual oTrigger
está anexado
O Property
e Value
compõem a condição e a Setters
coleção é a resposta. Quando o indicado Property
tiver o valor indicado por Value
, os Setter
objetos na Setters
coleção serã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 por meio da Entry
Scale
propriedade quando a IsFocused
propriedade do Entry
é true
.
Embora não seja comum, o Trigger
pode ser definido no 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.
Disparar ações e animações
Também é possível executar um pouco de código com base em um gatilho. Esse código pode ser uma animação direcionada a uma propriedade. Uma maneira comum é usar um EventTrigger
, que define duas propriedades:
Event
do tipostring
, o nome de um eventoActions
do tipoIList<TriggerAction>
, uma lista de ações a serem executadas em resposta.
Para usar isso, você precisa escrever uma classe derivada de TriggerAction<T>
, geralmente TriggerAction<VisualElement>
. Você pode definir propriedades nessa classe. Essas são propriedades CLR simples em vez de propriedades associáveis porque TriggerAction
não derivam de BindableObject
. Você deve substituir o Invoke
método que é chamado quando a ação é invocada. 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 easing personalizada para ScaleAction
em um arquivo code-behind.
Você também pode invocar ações usando um Trigger
(como diferenciado de EventTrigger
). Isso exige que você esteja ciente de que TriggerBase
define duas coleções:
EnterActions
do tipoIList<TriggerAction>
ExitActions
do tipoIList<TriggerAction>
O exemplo EnterExitSwell demonstra como usar essas coleções.
Mais gatilhos de evento
A ScaleUpAndDownAction
classe na Xamarin.Formsbiblioteca Book.Toolkit chama ScaleTo
duas vezes para escalar e reduzir verticalmente. O exemplo ButtonGrowth usa isso em um estilo EventTrigger
para fornecer comentários visuais quando um Button
é pressionado. Essa animação dupla também é possível usando duas ações na coleção do tipo DelayedScaleAction
A ShiverAction
classe na Xamarin.Formsbiblioteca Book.Toolkit define uma ação de tremer personalizável. O exemplo DesabotodoDemo 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 double
. 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:
A amostra GenderColors requer a biblioteca SchoolOfFineArt e define as cores dos nomes dos alunos como azul ou rosa com base na Sex
propriedade :
O exemplo ButtonEnabler define a IsEnabled
propriedade de um Entry
como False
se a Length
propriedade da Text
propriedade do for 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
é uma coleção de condições. Quando são todos true
, os setters são aplicados. A classe define duas propriedades:
Conditions
do tipoIList<Condition>
Setters
do tipoIList<Setter>
Condition
é uma classe abstrata e tem duas classes descendentes:
PropertyCondition
, que temProperty
propriedades eValue
comoTrigger
BindingCondition
, que temBinding
propriedades eValue
comoDataTrigger
No exemplo AndConditions , um 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 reverter toda a lógica.
A combinação da 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 Button
pode ser habilitado se um 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 de Behavior<T>
e substitui os dois métodos a seguir:
O argumento é o elemento ao qual o comportamento está anexado. Em geral, o OnAttachedTo
método anexa alguns manipuladores de eventos e OnDetachingFrom
os desanexa. Como essa classe geralmente salva algum estado, geralmente não pode ser compartilhada em um Style
.
O exemplo BehaviorEntryValidation é semelhante a TriggerEntryValidation , exceto pelo fato de que ele usa um comportamento — a NumericValidationBehavior
classe na Xamarin.Formsbiblioteca Book.Toolkit .
Comportamentos com propriedades
Behavior<T>
deriva de Behavior
, que deriva de BindableObject
, para que as propriedades associáveis possam ser definidas em um comportamento. Essas propriedades podem estar ativas em associações de dados.
Isso é demonstrado no programa EmailValidationDemo que usa a ValidEmailBehavior
classe na Xamarin.Formsbiblioteca Book.Toolkit . ValidEmailBehavior
tem uma propriedade associá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.
Alternar e marcar caixas
É possível encapsular o comportamento de um botão de alternância em uma classe como ToggleBehavior
na biblioteca Book.Toolkit e, emXamarin.Forms seguida, definir todos os visuais para a alternância inteiramente em XAML.
O exemplo ToggleLabel usa o ToggleBehavior
com um 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 ToggleBase
e usa uma TranslateAction
classe para construir um botão de alternância semelhante ao Xamarin.FormsSwitch
.
Um RotateAction
no Xamarin.FormsBook.Toolkit fornece uma animação usada para criar uma alavanca animada no exemplo LeverToggle .
Respondendo a toques
Uma desvantagem de EventTrigger
é que você não pode anexá-lo a um TapGestureRecognizer
para responder a toques. Contornar esse problema é a finalidade do TapBehavior
Xamarin.FormsBook.Toolkit
O exemplo BoxViewTapShiver usa TapBehavior
para usar o anterior ShiverAction
para elementos tocados BoxView
.
O exemplo DescoladoExibições 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 agrupados por um string
nome de grupo.
O programa RadioLabels usa cadeias de caracteres de texto para seu botão de opção. O exemplo RadioStyle usa um Style
para a diferença de aparência entre botões marcados e desmarcados. O exemplo RadioImages usa imagens em caixa para seus botões de opção:
O exemplo TradicionalRadios desenha botões de opção tradicionais que aparecem com um ponto dentro de um círculo.
Esmaece e orientação
O exemplo final, MultiColorSliders , permite alternar entre três exibições de seleção de cores diferentes usando botões de opção. Os três modos de exibição esmaecem usando um FadeEnableAction
na Xamarin.Formsbiblioteca Book.Toolkit .
O programa também responde a alterações na orientação entre retrato e paisagem usando um GridOrientationBehavior
na Xamarin.Formsbiblioteca Book.Toolkit .