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

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

  1. //动作
  2. public class InvokeAction : TargetedTriggerAction<UIElement>
  3. {
  4. protected override void Invoke(object parameter)
  5. {
  6. if (ToInvoke != null)
  7. {
  8. ToInvoke(parameter, new RoutedEventArgs() { });
  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. <Grid x:Name="LayoutRoot" Background="White">
  12. <Image Width="300" Source="/SLTrigger;component/chun.jpg" Margin="50,127,50,-16">
  13. <i:Interaction.Triggers>
  14. <me:PaggerTrigger>
  15. <me:InvokeAction ToInvoke="PageClickHandler" />
  16. </me:PaggerTrigger>
  17. </i:Interaction.Triggers>
  18. </Image>
  19. </Grid>
  20. </UserControl>

在Xaml.cs代码如下:

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

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

转载于:https://blog.51cto.com/chengxingliang/827187

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

  1. Silverlight实用窍门大集合+Silverlight 5 最全新特性【目录索引】

    在最近的几个月内整理出了Silverlight的一些相关的比较实用的功能讲解文章,并且随着Silverlight 5 beta版本的发布整理出的新特性系列文章,在这里做一个总的概括和索引,以方便大家观 ...

  2. Silverlight实用窍门系列:59.多个中心点联动多线的可拖动控件扩展为拓扑图

    在本系列的第17篇文章中"Silverlight实用窍门系列:17.中心点联动多线的可拖动控件(绘制工程图.拓扑图基础) ",制作了基本的中心联动图标.有园友对此图的扩展不是很清晰 ...

  3. Silverlight实用窍门系列:71.Silverlight的Style

    此文章实例基于Silverlight实用窍门系列:68.Silverlight的资源字典ResourceDictionary,如有数据源疑问请参考该文章. 在Silverlight中的Style相当于 ...

  4. Silverlight实用窍门系列:40.Silverlight中捕捉视频,截图保存到本地

    在Silverlight中我们可以捕捉视频设备以制作视频会议系统,或者通过视频设备截图功能上传头像等功能. 下面我们通过一个简单的实例来访问视频设备,并且截取图像下载该截图文件至本地. 一.在Silv ...

  5. Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别...

    问题一:在某一些情况下,我们使用MVVM模式的时候,对于某一个字段(AgeField)需要在前台的很多个控件(A.B.C.D.E)进行绑定,但是如何能够让我们后台字段名改变的时候能够非常方便的改变所有 ...

  6. Silverlight实用窍门系列:54.详解Silverlight中的矩阵变换MatrixTransform,实现其余各种变换【附带实例源码】...

    在Silverlight中的MatrixTransform矩阵变换相对上篇文章所述的变换较复杂一些,但这种变换也更灵活. MatrixTransform的实质:让需要变换的元素上的每一个像素点*矩阵得 ...

  7. Silverlight实用窍门系列:40.Silverlight中捕捉视频,截图保存到本地【附带实例源码】...

    在Silverlight中我们可以捕捉视频设备以制作视频会议系统,或者通过视频设备截图功能上传头像等功能. 下面我们通过一个简单的实例来访问视频设备,并且截取图像下载该截图文件至本地. 一.在Silv ...

  8. Silverlight实用窍门系列:56.Silverlight中的Binding使用(一)【附带实例源码】

    本文将详细讲述Silverlight中Binding,包括Binding的属性和用法,Binding的数据流向. Binding:一个完整的Binding过程是让源对象中的某个属性值通过一定流向规则进 ...

  9. Silverlight实用窍门系列:63.Silverlight中的Command,自定义简单Command

    在Silverlight中的MVVM模式下将前台页面和ViewModel界面交互分离开是通过本节所要讲述的Command实现的.我们自定义一个Command需要继承于ICommand接口并且实现这个接 ...

最新文章

  1. 重写,重载,抽象类,接口,抽象类和接口区别
  2. ThinkPHP框架整合phpqrcode生成二维码DEMO
  3. 借助TensorFlow框架,到底能做什么?
  4. P2336-[SCOI2012]喵星球上的点名【SA,树状数组】
  5. springmvc是什么_当一个http请求来临时,SpringMVC究竟偷偷帮你做了什么?
  6. Taro+react开发(28)本地用require线上不必
  7. Power BI与Power Query、Power Pivot 是什么关系?
  8. java cpu高_Java中的CPU占用高和内存占用高的问题排查
  9. J2EE项目中异常处理
  10. (转载)数据库的三范式:我见过讲的最通俗易懂的三范式!!!
  11. Python起重机主梁截面特性计算小程序
  12. 数据时代建设医疗数据,主要有哪些意义?
  13. 本科毕设不通过是什么原因,哪个少年不曾为如何能够顺利优秀毕业而愁眉苦战
  14. python-docx 复制一页_python 怎么用docx读取word的某一页然后放到新的word文档中?...
  15. [渝粤教育] 浙江工商大学 工程英语口语(王晓英) 参考 资料
  16. bong手环显示连接不上服务器,bong智能手环使用说明
  17. 无处安放的野心和能力
  18. android apk 永久root,Android 实现永久性开启adb 的root权限
  19. Python常用模块 hashlib,pymysql,logging和datetime模块习题检测
  20. 安科瑞无线测温装置ARTM的功能特点有哪些

热门文章

  1. 华为:5G技术前景堪忧,运营商将很难从5G赚钱
  2. 未来货运:无人驾驶技术和卡车司机如何配合?
  3. GIF动图之父Stephen Wilhite去世,享年74岁
  4. 别再盲目学 Python 了!
  5. 微软、华为海思、高通等 50 家公司源代码被泄露!
  6. 超可爱,抖音爆款实时视频漫画变身特效技术
  7. Mozilla 财报:2017年收入增长超过 4000 万美元
  8. mongodb:linux基本操作
  9. 1.spring boot要求最低jdk1.8,平安默认1.6问题,-》安装JDK1.8 2.maven 3.3.3要求最低jdk1.7-安装jdk 1.8...
  10. PHP的学习--Traits新特性