概述展示一个鼠标
滚动事件的示例只需要几行代码即可,我认为大部分人都可以在几分钟内做好,并理解它是如何工作的。因此我决定将这个
事件和Expression Blend中
引入的新行为一起合并成一个例子进行介绍,本文主要介绍如何创建行为,如何使用鼠标滚动事件,以及如何将其添加到可滚动的控件上,以便使用鼠标滚轮。 行为是什么? 你可能曾经在ASP.NET Ajax框架中使用过行为,说得简单点这里的行为就是ASP 展示一个鼠标滚动事件的示例只需要几行代码即可,我认为大部分人都可以在几分钟内做好,并理解它是如何工作的。因此我决定将这个事件和Expression Blend中引入的新行为一起合并成一个例子进行介绍,本文主要介绍如何创建行为,如何使用鼠标滚动事件,以及如何将其添加到可滚动的控件上,以便使用鼠标滚轮。 行为是什么? 你可能曾经在ASP.NET AJAX框架中使用过行为,说得简单点这里的行为就是ASP.NET AJAX语法的Silverlight实现,允许创建可复用的和可连接到HTML控件的行为。(让Silverlight 3 *** 作简单的和手工具) 从Blend 3 Beta版开始引入行为的概念,可以在设计窗口中拖动内置的行为,增加图形元素的活力,进入Asset文件夹,在这里可以找到控件、效果、资源和其它东西,现在又多了一个行为卡片。 Expression Blend 3.0 引入了许多行为类型,行为< T>是其中最简单的了,适用于DependencyObject,行为可以修改控件的外观,添加元素,修改属性或处理一个或多个事件。MouseDragElementBehavior就是一个活生生的例子,它连接鼠标事件,让元素可以在页面中拖动。 编写一个行为 编写一个行为是一件很简单的事情,行为是行为< T>的类扩展,因此首先要做的是引用C:\Program files\Microsoft SDKs\Expression\Blend 3\Interactivity\librarIEs\Silverlight目录下的Microsoft.Expression.Interactions.dll和System.windows.Interactivity.dll。如果你从Blend 3.0添加一个现有的行为,那这些动态库会自动引用到项目中。 引用添加好后,就可以创建类了: 1: public class MouseWheelScrollBehavior : Behavior< Control> 2: { 3: // 在这里添加实现代码 4: } 由于我们是要扩展Silverlight中可滚动的组件,我们需要创建一个可以连接到Control类的类型,在Silverlight中没有通用的用于可滚动组件(如ScrollVIEwer、DataGrID和DataGrID)的类,这就需要自己想办法处理才行,我们将在后面进行介绍,目前先分析一下如何创建一个行为。(微软Silverlight中加入Smooth Streaming) 接下来要做的是在目标对象上连接MouseWheel事件,当我们完成行为类的扩展后,我们有两个办法来处理连接和释放目标上的行为:将行为连接到对象上时调用OnAttached,释放对象上的行为时使用OnDetaching。OnAttached和OnDetaching是连接和释放公共事件的理想选择,目标对象是通过行为< T>在Associatedobject属性上暴露的,下面是我的代码示例: 1: /// < summary> 2: /// Called after the behavior is attached to an Associatedobject. 3: /// < /summary> 4: /// < remarks>OverrIDe this to hook up functionality to the Associatedobject.< /remarks> 5: protected overrIDe voID OnAttached() 6: { 7: this.Associatedobject.MouseWheel += new MouseWheelEventHandler(Associatedobject_MouseWheel); 8: base.OnAttached(); 9: } 10: 11: /// < summary> 12: /// Called when the behavior is being detached from its Associatedobject,but before it has actually occurred. 13: /// < /summary> 14: /// < remarks>OverrIDe this to unhook functionality from the Associatedobject.< /remarks> 15: protected overrIDe voID OnDetaching() 16: { 17: this.Associatedobject.MouseWheel -= new MouseWheelEventHandler(Associatedobject_MouseWheel); 18: base.OnDetaching(); 19: } 现在行为已经准备好连接到对象,但它没有做任何事情,我们需要为可滚动组件实现滚动。 滚动可滚动的组件 -- 并非如此简单 由于没有通用的滚动接口,即使为ScrollVIEwer创建一个行为比较简单,但为DataGrID或ListBox创建滚动行为却并不简单。 我在 http://blog.thekieners.com/2009/04/06/how-to-enable-mouse-wheel-scrolling-in-silverlight-without-extending-controls/发现有人曾经写过一篇文章介绍如何使用automation API而不扩展控件实现鼠标滚动。大家可以去了解一下。这里我们需要知道的是automation API提供了一个IScrollProvIDer接口,因此我们需要修改OnAttached方法,为连接对象创建automation Peer。 1: /// < summary> 2: /// Gets or sets the peer. 3: /// < /summary> 4: /// < value>The peer.< /value> 5: private automationPeer Peer { get; set; } 6: 7: /// < summary> 8: /// Called after the behavior is attached to an Associatedobject. 9: /// < /summary> 10: /// < remarks>OverrIDe this to hook up functionality to the Associatedobject.< /remarks> 11: protected overrIDe voID OnAttached() 12: { 13: this.Peer = FrameworkElementautomationPeer.fromElement(this.Associatedobject); 14: 15: if (this.Peer == null) 16: this.Peer = FrameworkElementautomationPeer.CreatePeerForElement(this.Associatedobject); 17: 18: this.Associatedobject.MouseWheel += new MouseWheelEventHandler(Associatedobject_MouseWheel); 19: base.OnAttached(); 20: } 如果控件已经创建了自动化接口,我们首先来研究一下它,如果接口不存在,我们需要先创建,automationPeer作为一个成员属性保存,使用MouseWheel事件时会使用到它,下面是滚动目标对象的示例代码: 1: /// < summary> 2: /// Handles the MouseWheel event of the Associatedobject control. 3: /// < /summary> 4: /// < param name="sender">The source of the event.< /param> 5: /// < param name="e">The < see cref="System.windows.input.MouseWheelEventArgs"/> instance containing the event data.< /param> 6: voID Associatedobject_MouseWheel(object sender,MouseWheelEventArgs e) 7: { 8: this.Associatedobject.Focus(); 9: 10: int direction = Math.Sign(e.Delta); 11: 12: ScrollAmount scrollAmount = 13: (direction < 0) ? ScrollAmount.Smallincrement : ScrollAmount.SmallDecrement; 14: 15: if (this.Peer != null) 16: { 17: IScrollProvIDer scrollProvIDer = 18: this.Peer.GetPattern(PatternInterface.Scroll) as IScrollProvIDer; 19: 20: bool shiftKey = (Keyboard.ModifIErs & ModifIErKeys.Shift) == ModifIErKeys.Shift; 21: 22: if (scrollProvIDer != null && scrollProvIDer.VerticallyScrollable && !shiftKey) 23: scrollProvIDer.Scroll(ScrollAmount.NoAmount,scrollAmount); 24: else if (scrollProvIDer != null && scrollProvIDer.VerticallyScrollable && shiftKey) 25: scrollProvIDer.Scroll(scrollAmount,ScrollAmount.NoAmount); 26: } 27: } 我们获取了Delta后需要提取出滚动的方向,否则我们就不能指定目标滚动的像素数量,但ScrollAmount可能是Smallincrement或SmallDecrement(或LargeIncrement,LargeDecrement),因此使用方向我们可以确定是递增还是递减。 由于控件既可以横向滚动也可以纵向滚动,我决定检查换档键是否被按下,如果按下就实现横向滚动,最后在IScrollProvIDer中使用Scroll方法,不需要检查边界。 使用行为 使用Blend应用行为的 *** 作非常简单,Blend资产库会扫描项目中所有的类,并显示出来,因此只需要拖动行为到滚动组件上就可以应用行为了,我们需要学习的是通过编码应用行为,下面是一个例子: 1: < UserControl 2: xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3: xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml" 4: xmlns:i="clr-namespace:System.windows.Interactivity;assembly=System.windows.Interactivity" 5: xmlns:local="clr-namespace:Elite.Silverlight3.MouseWheelSample.Silverlight.Classes" 6: xmlns:data="clr-namespace:System.windows.Controls;assembly=System.windows.Controls.Data" 7: x:Class="Elite.Silverlight3.MouseWheelSample.Silverlight.MainPage" 8: WIDth="auto" Height="auto"> 9: 10: ... omissis ... 11: 12: < data:DataGrID GrID.Column="1" GrID.Row="0" ItemsSource="{Binding DataItems}" margin="20"> 13: < i:Interaction.Behaviors> 14: < local:MouseWheelScrollBehavior /> 15: < /i:Interaction.Behaviors> 16: < /data:DataGrID> 在UserControl中,我们声明了要使用的命名空间,在这个例子中,"i"代表交互,"local"指的是融入了新行为的本地类,在第二部分中我们将行为连接到DataGrID了,将行为连接到ScrollVIEwer或ListBox的代码非常类似,运行这个项目,我们在DataGrID上就可以使用鼠标滚轮了。 小结 本文介绍的技术非常有实用价值,几乎适用于所有的可滚动控件,但ComboBox是个例外,因为它没有直接实现IScrollProvIDer接口,缺点是只能工作在windows上,这是一个较大的问题,但目前并没有解决办法,因为它是目前通过编程实现滚动的唯一方法,此外我还注意到MouseWheel事件只能在windows下IE和firefox (非windows模式)中工作,这是由Safari和firefox 的架构决定的,唯一变通的方法是使用DOM事件。 总结
以上是内存溢出为你收集整理的Silverlight 3.0 RTW引入-- 鼠标滚动事件全部内容,希望文章能够帮你解决Silverlight 3.0 RTW引入-- 鼠标滚动事件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
评论列表(0条)