Silverlight实用窍门系列:61.Silverlight中的Trigger触发器,自定义翻页触发器

简介:

 在Silverlight应用程序和客户进行交互工作的时候可以不用写后台代码而通过Xaml代码来实现,在本文我们将学习了解Trigger触发器。

       Trigger触发器:引发动作的因素,比如鼠标点击、键盘输入、鼠标双击、键盘Enter键敲入、鼠标中键滚动等等,这些都是触发动作交互的条件。

       Trigger分为以下两类:

    一、系统定义好的如EventTrigger、PropertyTrigger等。

    二、用户自定义的Trigger,例如在SL4中是没有鼠标双击事件的,这时我们可以新建一个DoubleClickTrriger,通过定时器检测当点击页面同一个地方的时间间隔小于300毫秒的都属于鼠标触发动作。

   EventTrigger主要是指定触发的事件名称,如下例是在MouseLeftButtonUp的时候触发ChangePropertyAction动作,在本例中不作详细讲述: 

 

 
  1. <Rectangle Width="300"
  2.     <i:Interaction.Triggers> 
  3.         <i:EventTrigger EventName="MouseLeftButtonUp"
  4.             <ei:ChangePropertyAction /> 
  5.         </i:EventTrigger> 
  6.     </i:Interaction.Triggers> 
  7. </Rectangle> 

        自定义Trigger:本实例中我们自定义一个翻页的触发器,它通过在指定对象上按下按钮,然后滑动鼠标向左或者向右移动然后放开鼠标,自动检测是向左翻 页还是向右翻页。自定义Trigger和Behavior一样只需要重写OnAttached和OnDetaching方法即可,自定义Trigger需 要继承于TriggerBase<T>类。

        自定义Trigger代码如下:

 

 
  1. public class PaggerTrigger : TriggerBase<UIElement> 
  2.     private Point _downPosition; 
  3.  
  4.     protected override void OnAttached() 
  5.     { 
  6.         base.OnAttached(); 
  7.         //加载事件 
  8.         AssociatedObject.MouseLeftButtonDown += new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown); 
  9.         AssociatedObject.MouseLeftButtonUp += new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonUp); 
  10.     } 
  11.  
  12.     void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
  13.     { 
  14.         UIElement element = sender as UIElement; 
  15.         _downPosition = e.GetPosition(element); 
  16.     } 
  17.  
  18.     void AssociatedObject_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
  19.     { 
  20.         UIElement element = sender as UIElement; 
  21.         Point position = e.GetPosition(element); 
  22.         double X_Content =  position.X - _downPosition.X ; 
  23.         PageEnum pageEnum = PageEnum.PageLeft; 
  24.         if (Math.Abs(X_Content) > 10) 
  25.         { 
  26.             if (X_Content > 0) 
  27.             { 
  28.                 pageEnum = PageEnum.PageRight; 
  29.             } 
  30.             else 
  31.             { 
  32.                 pageEnum = PageEnum.PageLeft; 
  33.             } 
  34.             InvokeActions(pageEnum); 
  35.         } 
  36.     } 
  37.  
  38.     protected override void OnDetaching() 
  39.     { 
  40.         base.OnDetaching(); 
  41.         //卸载事件 
  42.         AssociatedObject.MouseLeftButtonDown -= new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown); 
  43.         AssociatedObject.MouseLeftButtonUp -= new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonUp); 
  44.     } 
  45.  
  46. /// <summary> 
  47. /// 指示翻页方向枚举 
  48. /// </summary> 
  49. public enum PageEnum 
  50. {  
  51.     /// <summary> 
  52.     /// 左翻页 
  53.     /// </summary> 
  54.     PageLeft, 
  55.  
  56.     /// <summary> 
  57.     /// 右翻页 
  58.     /// </summary> 
  59.     PageRight 

       自定义的Action代码如下,注意Action是触发器被触发时执行的动作,下一篇会详细讲述,其代码如下:

 

 
  1. //动作 
  2. public class InvokeAction : TargetedTriggerAction<UIElement> 
  3.     protected override void Invoke(object parameter) 
  4.     { 
  5.         if (ToInvoke != null
  6.         { 
  7.             ToInvoke(parameter, new RoutedEventArgs() { }); 
  8.         } 
  9.     } 
  10.  
  11.     public delegate void Handler(object sender, RoutedEventArgs e); 
  12.     public event Handler ToInvoke; 
  13.  

        在主页面调用的时候其Xaml代码如下:

 

 
  1. <UserControl x:Class="SLTrigger.MainPage" 
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  4.     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  5.     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  6.     xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
  7.           xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"   
  8.              xmlns:me="clr-namespace:SLTrigger" 
  9.     mc:Ignorable="d" 
  10.     d:DesignHeight="300" d:DesignWidth="400"
  11.  
  12.     <Grid x:Name="LayoutRoot" Background="White"
  13.         <Image Width="300" Source="/SLTrigger;component/chun.jpg" Margin="50,127,50,-16"
  14.             <i:Interaction.Triggers> 
  15.                 <me:PaggerTrigger> 
  16.                     <me:InvokeAction ToInvoke="PageClickHandler" /> 
  17.                 </me:PaggerTrigger> 
  18.             </i:Interaction.Triggers> 
  19.         </Image> 
  20.     </Grid> 
  21. </UserControl> 

        在Xaml.cs代码如下:

 

 
  1. public partial class MainPage : UserControl 
  2.     public MainPage() 
  3.     { 
  4.         InitializeComponent(); 
  5.     } 
  6.     //实现指定动作时出发的事件处理程序 
  7.     private void PageClickHandler(object sender, RoutedEventArgs e) 
  8.     { 
  9.         PageEnum pageEnum = (PageEnum)sender; 
  10.         string info = string.Empty; 
  11.         if (pageEnum == PageEnum.PageLeft) 
  12.         { 
  13.             info = "向左翻页"
  14.         } 
  15.         else if (pageEnum == PageEnum.PageRight) 
  16.         { 
  17.             info = "向右翻页"
  18.         } 
  19.         MessageBox.Show(info); 
  20.     } 

        最后如需源码请点击 SLTrigger.zip 下载,需要引用System.Windows.Interactivity.dll 。



本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/827187


相关文章
|
6月前
|
人工智能 运维 Serverless
Serverless 应用引擎产品使用之阿里函数计算中3.0的函数只加自定义域名没有任何触发器的意义如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
105 1
|
6月前
|
SQL 关系型数据库 MySQL
⑩⑥ 【MySQL】详解 触发器TRIGGER,协助 确保数据的完整性,日志记录,数据校验等操作。
⑩⑥ 【MySQL】详解 触发器TRIGGER,协助 确保数据的完整性,日志记录,数据校验等操作。
82 0
|
12月前
|
关系型数据库 MySQL
Mysql Trigger触发器学习总结
Mysql Trigger触发器学习总结
50 0
|
Java 调度 Spring
【小家Spring】Spring任务调度核心接口(类)之---TaskScheduler(任务调度器)、Trigger(触发器)、ScheduledTask(调度任务)详解(上)
【小家Spring】Spring任务调度核心接口(类)之---TaskScheduler(任务调度器)、Trigger(触发器)、ScheduledTask(调度任务)详解(上)
【小家Spring】Spring任务调度核心接口(类)之---TaskScheduler(任务调度器)、Trigger(触发器)、ScheduledTask(调度任务)详解(上)
|
Java 调度 Spring
【小家Spring】Spring任务调度核心接口(类)之---TaskScheduler(任务调度器)、Trigger(触发器)、ScheduledTask(调度任务)详解(下)
【小家Spring】Spring任务调度核心接口(类)之---TaskScheduler(任务调度器)、Trigger(触发器)、ScheduledTask(调度任务)详解(下)
|
SQL 存储 Go
SQL SERVER TRIGGER 触发器
1.触发器简介 触发器是一种特殊的存储过程,它的执行不是由程序调用,也不是手动执行,而是由事件来触发。触发器是当对某一个表进行操作。例如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。
1984 0
Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象
原文:Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象 原创文章,如需转载,请注明出处。   最近在一直研究Silverlight下的数据绑定控件,发现有这样两个接口IEditableObject 和IEditableCollectionView,记录一下结论,欢迎交流指正。
869 0
|
SQL 存储 .NET
SQL Server CLR 使用 C# 自定义存储过程和触发器
原文:SQL Server CLR 使用 C# 自定义存储过程和触发器 这一篇博客接着上一篇博客继续介绍 SQL CLR Stored Procedure 和 CLR Trigger, 上一篇博客介绍了 SQL CLR Function 的使用,以及 CLR 程序集的注册和 CLR Function 的注册。
979 0
|
关系型数据库 MySQL 数据库
MySQL 基础---触发器(TRIGGER)
触发器: 实现由一些表事件触发的某个操作,是与数据库对象表关联最紧密的数据库对象之一。在数据库系统中,当执行表事件时,则会激活触发器,从而执行其包含的操作。
812 0
|
关系型数据库 MySQL SQL
mysql之触发器trigger
mysql之触发器trigger 触发器(trigger):监视某种情况,并触发某种操作。 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/before) 4.触发事件(insert/update/delete) 语法: create trigger triggerName after/before insert/update/delete on 表名 for each row   #这句话在mysql是固定的 begin sql语句; end; 注:各自颜色对应上面的四要素。
919 0