Silverlight 3.0 RTW新特性汇总

  展示一个鼠标滚动事件的示例只需要几行代码即可,我认为大部分人都可以在几分钟内做好,并理解它是如何工作的。因此我决定将这个事件和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: }

你可能感兴趣的:(silverlight)