第二十三章:触发器和行为(七)

简介: 行为触发器和行为通常是串联讨论的,因为它们具有一些应用重叠。 有时候你会感到困惑是否使用触发器或行为,因为似乎要么这样做工作。你可以用触发器做任何事情,你也可以做一个行为。 但是,行为总是涉及一些代码,这是一个派生自Behavior 的类。

行为

触发器和行为通常是串联讨论的,因为它们具有一些应用重叠。 有时候你会感到困惑是否使用触发器或行为,因为似乎要么这样做
工作。
你可以用触发器做任何事情,你也可以做一个行为。 但是,行为总是涉及一些代码,这是一个派生自Behavior 的类。 如果您正在为EventTrigger编写Action 派生词,或者为其他触发器的EnterActions或ExitActions集合编写,则触发器仅涉及代码。
显然,如果您可以使用其中一个触发器执行所需操作而无需编写任何代码,则不要使用行为。 但有时它并不那么清楚。
让我们比较执行相同工作的触发器和行为。
本章前面显示的TriggerEntryValidation程序使用一个名为NumericEntryAction的类,它检查输入到Entry视图中的数字是否有资格作为有效的double值,如果不是,则将文本设置为红色:

namespace Xamarin.FormsBook.Toolkit
{ 
    public class NumericValidationAction : TriggerAction<Entry> 
    {
        protected override void Invoke(Entry entry)
        {
            double result;
            bool isValid = Double.TryParse(entry.Text, out result);
            entry.TextColor = isValid ? Color.Default : Color.Red;
        }
    }
}

这是在附加到条目的EventTrigger中引用的:

<Entry Placeholder="Enter a System.Double">
    <Entry.Triggers>
        <EventTrigger Event="TextChanged">
            <toolkit:NumericValidationAction />
        </EventTrigger>
    </Entry.Triggers>
</Entry>

您可以对同一作业使用行为。 第一步是从Behavior 派生一个类。 泛型参数是行为可以处理的最通用的基类。 在这个例子中,这是一个Entry视图。 然后,重写两个名为OnAttachedTo和OnDetachingFrom的虚拟方法。 当行为附加到特定可视对象时,将调用OnAttachedTo方法,并为您的行为提供初始化自身的机会。 通常这涉及将一些事件处理程序附加到对象。 从可视对象中删除行为时,将调用OnDetachingFrom方法。 即使仅在程序终止时发生这种情况,您也应该撤消OnAttachedTo方法所做的任何事情。
这是NumericValidationBehavior类:

namespace Xamarin.FormsBook.Toolkit
{
    public class NumericValidationBehavior : Behavior<Entry>
    {
        protected override void OnAttachedTo(Entry entry)
        {
            base.OnAttachedTo(entry);
            entry.TextChanged += OnEntryTextChanged;
        }
 
        protected override void OnDetachingFrom(Entry entry)
        {
            base.OnDetachingFrom(entry);
            entry.TextChanged -= OnEntryTextChanged;
        }
        void OnEntryTextChanged(object sender, TextChangedEventArgs args)
        {
            double result;
            bool isValid = Double.TryParse(args.NewTextValue, out result);
            ((Entry)sender).TextColor = isValid ? Color.Default : Color.Red;
        }
    }
}

OnAttachedTo方法为Entry的TextChanged事件附加处理程序,OnDetachingFrom方法分离该处理程序。 处理程序本身与NumericValidationAction中的Invoke方法执行相同的工作。
因为NumericValidationBehavior类安装TextChanged事件的处理程序,所以可以使用该行为而不指定类名以外的任何内容。 这是BehaviorEntryValidation程序的XAML文件,它与使用EventTrigger的早期程序不同,它通过指定应用于四个Entry视图的隐式样式的行为:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:toolkit=
                 "clr-namespace:Xamarin.FormsBook.Toolkit;assembly=Xamarin.FormsBook.Toolkit"
             x:Class="BehaviorEntryValidation.BehaviorEntryValidationPage"
             Padding="50">
    <ContentPage.Resources>
        <ResourceDictionary>
            <Style TargetType="Entry">
                <Style.Behaviors>
                    <toolkit:NumericValidationBehavior />
                </Style.Behaviors>
            </Style>
        </ResourceDictionary>
    </ContentPage.Resources>
    <StackLayout>
        <Entry Placeholder="Enter a System.Double" />
        <Entry Placeholder="Enter a System.Double" />
        <Entry Placeholder="Enter a System.Double" />
        <Entry Placeholder="Enter a System.Double" />
    </StackLayout>
</ContentPage>

此Style对象在四个Entry视图中共享,因此只实例化一个NumericValidationBehavior对象。 由于此单个对象附加到四个Entry视图中的每一个,因此它会在每个视图上附加一个TextChanged处理程序,以便单个NumericValidationBehavior对象在四个视图上独立运行:
2019_04_05_200913
在这个特定的例子中,TriggerAction比行为更受欢迎,因为它代码较少而代码不引用特定事件,因此它更加通用。
但是行为可以像您想要的那样一般化或特定,行为也可以通过数据绑定更全面地参与XAML文件。

目录
相关文章
|
JavaScript Android开发
第二十三章:触发器和行为(十二)
淡化和定向在本书中,您已经看到了几个颜色选择程序,可以通过使用三个Slider元素以交互方式形成颜色。 本章的最后一个示例是另一个颜色选择程序,但是这个程序为您提供了选项:它包含三个标记为“RGB Hex”,“RGB Float”和“HSL”的单选按钮(实际上是简单的Label元素)。
677 0
|
JavaScript Android开发
第二十三章:触发器和行为(十一)
单选按钮内置于旧汽车仪表板中的无线电通常具有一排六个(左右)按钮,可以为各种无线电台“编程”。 按下其中一个按钮会导致无线电跳转到该预选电台,并且还会弹出前一个选择按钮。那些旧的汽车收音机现在是古董,但我们的电脑屏幕上的互斥选项仍然由我们称为单选按钮的视觉对象表示。
883 0
|
JavaScript Android开发
第二十三章:触发器和行为(十)
响应水龙头切换视图的各种表现形式演示了一种响应XAML文件中的点击的方法。 如果将tap事件集成到VisualElement类中,您可以使用EventTrigger更直接且更轻松地获取它们。 但是您无法将EventTrigger附加到TapGestureRecognizer。
523 0
|
JavaScript Android开发 Windows
第二十三章:触发器和行为(九)
切换和复选框在第15章“交互式界面”和第16章“数据绑定”中,您了解了如何构造传统的CheckBox视图。 但是,自定义视图的另一种方法是将视图的交互逻辑合并到行为中,然后完全在XAML中实现视觉效果。
703 0
|
Android开发
第二十三章:触发器和行为(八)
具有属性的行为Behavior 类派生自Behavior类,该类派生自BindableObject。这表明您的Behavior 派生可以定义自己的可绑定属性。之前你看过一些Action 衍生产品,比如ScaleAction和ShiverAction,它们定义了一些属性以赋予它们更大的灵活性。
622 0
|
JavaScript Android开发
第二十三章:触发器和行为(六)
MultiTrigger中的组合条件Trigger和DataTrigger都有效地监视属性以确定它是否等于特定值。 这称为触发器的条件,如果条件为真,则调用Setter对象的集合。作为程序员,您可能会开始怀疑是否可以在触发器中具有多个条件。
623 0
|
JavaScript Android开发 iOS开发
第二十三章:触发器和行为(五)
数据触发器到目前为止,您只看到在特定对象的上下文中运行的触发器。 触发器通过更改同一对象的另一个属性或通过调用影响该对象的Action来响应对象属性的更改。 EventTrigger同样响应一个对象触发的事件,以在同一个对象上调用Action。
888 0
|
JavaScript Android开发 Windows
第二十三章:触发器和行为(四)
更多事件触发器前一章关于动画的章节展示了一个按钮,它在点击时旋转或缩放。 虽然大多数动画示例都是为了制作有趣的演示而采取极端措施,但是按钮用一点动画来响应点击并不是不合理的。 这是EventTrigger的完美工作。
731 0
|
JavaScript Android开发
第二十三章:触发器和行为(三)
触发动作和动画虽然某些触发器可以完全在XAML中实现,但其他触发器需要一些代码支持。 如您所知,Xamarin.Forms没有直接支持在XAML中实现动画,因此如果您想使用触发器为元素设置动画,则需要一些代码。
925 0
|
JavaScript Android开发
第二十三章:触发器和行为(二)
触发器 在最普遍(和最模糊)的意义上,触发器是导致响应的条件。 更具体地说,触发器通过设置另一个属性或运行一些代码来响应属性更改或触发事件。 几乎总是,设置的属性或运行的代码涉及用户界面,并在XAML中表示。
913 0