`
dongdian
  • 浏览: 98687 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Silverlight 3.0 RTW引入-- 鼠标滚动事件

 
阅读更多

展示一个鼠标滚动事件的示例只需要几行代码即可,我认为大部分人都可以在几分钟内做好,并理解它是如何工作的。因此我决定将这个事件和Expression Blend中引入的新行为一起合并成一个例子进行介绍,本文主要介绍如何创建行为,如何使用鼠标滚动事件,以及如何将其添加到可滚动的控件上,以便使用鼠标滚轮。

行为是什么?

你可能曾经在ASP.NET Ajax框架中使用过行为,说得简单点这里的行为就是ASP.NET Ajax语法的Silverlight实现,允许创建可复用的和可连接到HTML控件的行为。(让Silverlight 3操作简单的和手工具

从Blend 3 Beta版开始引入行为的概念,可以在设计窗口中拖动内置的行为,增加图形元素的活力,进入Asset文件夹,在这里可以找到控件、效果、资源和其它东西,现在又多了一个行为卡片。

Expression Blend 3.0 引入了许多行为类型,行为是其中最简单的了,适用于DependencyObject,行为可以修改控件的外观,添加元素,修改属性或处理一个或多个事件。MouseDragElementBehavior就是一个活生生的例子,它连接鼠标事件,让元素可以在页面中拖动。

编写一个行为

编写一个行为是一件很简单的事情,行为是行为的类扩展,因此首先要做的是引用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

2: {

3: // 在这里添加实现代码

4: }

由于我们是要扩展Silverlight中可滚动的组件,我们需要创建一个可以连接到Control类的类型,在Silverlight中没有通用的用于可滚动组件(如ScrollViewer、DataGrid和DataGrid)的类,这就需要自己想办法处理才行,我们将在后面进行介绍,目前先分析一下如何创建一个行为。(微软Silverlight中加入Smooth Streaming

接下来要做的是在目标对象上连接MouseWheel事件,当我们完成行为类的扩展后,我们有两个办法来处理连接和释放目标上的行为:将行为连接到对象上时调用OnAttached,释放对象上的行为时使用OnDetaching。OnAttached和OnDetaching是连接和释放公共事件的理想选择,目标对象是通过行为在AssociatedObject属性上暴露的,下面是我的代码示例:

1: ///

2: /// Called after the behavior is attached to an AssociatedObject.

3: ///

4: /// Override this to hook up functionality to the AssociatedObject.

5: protected override void OnAttached()

6: {

7: this.AssociatedObject.MouseWheel += new MouseWheelEventHandler(AssociatedObject_MouseWheel);

8: base.OnAttached();

9: }

10:

11: ///

12: /// Called when the behavior is being detached from its AssociatedObject, but before it has actually occurred.

13: ///

14: /// Override this to unhook functionality from the AssociatedObject.

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: ///

2: /// Gets or sets the peer.

3: ///

4: /// The peer.

5: private AutomationPeer Peer { get; set; }

6:

7: ///

8: /// Called after the behavior is attached to an AssociatedObject.

9: ///

10: /// Override this to hook up functionality to the AssociatedObject.

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: ///

2: /// Handles the MouseWheel event of the AssociatedObject control.

3: ///

4: /// The source of the event.

5: /// The System.Windows.Input.MouseWheelEventArgs"/> instance containing the event data.

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

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:

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: Row="0" ItemsSource="{Binding DataItems}" Margin="20">

13:

14:

15:

16:

在UserControl中,我们声明了要使用的命名空间,在这个例子中,"i"代表交互,"local"指的是融入了新行为的本地类,在第二部分中我们将行为连接到DataGrid了,将行为连接到ScrollViewer或ListBox的代码非常类似,运行这个项目,我们在DataGrid上就可以使用鼠标滚轮了。

小结

本文介绍的技术非常有实用价值,几乎适用于所有的可滚动控件,但ComboBox是个例外,因为它没有直接实现IScrollProvider接口,缺点是只能工作在Windows上,这是一个较大的问题,但目前并没有解决办法,因为它是目前通过编程实现滚动的唯一方法,此外我还注意到MouseWheel事件只能在Windows下IE和Firefox (非Windows模式)中工作,这是由Safari和Firefox 的架构决定的,唯一变通的方法是使用DOM事件。

分享到:
评论

相关推荐

    rtw89-main网卡驱动包

    rtw89-main网卡驱动包

    rtw89-main.zip

    rtw89-main.zip

    RTW Shop - eCommerce Website in Python using Django

    RTW Shop - eCommerce Website in Python using Django

    MATLABplusSimulink仿真利用RTW-EC生产DSP目标代码

    MATLABplusSimulink仿真利用RTW-EC生产DSP目标代码本资源系百度网盘分享地址

    matlab-rtw实验例程

    matlab-rtw实验例程matlab-rtw实验例程matlab-rtw实验例程 (matlab real time)

    rtw-时间跟踪器命令行工具-Rust开发

    分支状态主设备RTW-Rust Time Watcher命令行界面(CLI)时间跟踪器。 CLI使用情况稳定,基础API不稳定。 注意:T分支状态主设备RTW-Rust Time Watcher命令行界面(CLI)时间跟踪器。 CLI使用情况稳定,基础API不稳定...

    wpa_supplicant_8_kk_4.4_rtw_r25669.20171213.tar.gz

    wpa_supplicant hostapd 源码

    ComponentOne Studio for Silverlight2

    ComponentOne Studio for Silverlight2 RTW 在VS2008SP1+Silverlight2 RTW tools +Express Blend2 sp1 环境下测试通过 提供了所有示例源代码包括(DataGrid,TreeView,ImagineDeepzoom,ListBox, SaleBook,Visual ...

    Silverlight_Tools(分卷4)

    产品版本:9.0.30729.146 产品名称:Silverlight Tools RTW 公司:Microsoft Corporation 内部名称:Silverlight_Tools.exe 文件版本:9.0.30729.146 语言:英语(美国) 源文件名:Silverlight_Tools.exe 共5个分卷

    使用Silverlight做的计算器

    在VS2008SP1+Silverlight2 RTW tools +Express Blend2 sp1 环境下调试通过

    Silverlight_Tools(分卷3)

    产品版本:9.0.30729.146 产品名称:Silverlight Tools RTW 公司:Microsoft Corporation 内部名称:Silverlight_Tools.exe 文件版本:9.0.30729.146 语言:英语(美国) 源文件名:Silverlight_Tools.exe 共5个分卷

    Silverlight_Tools(分卷1)

    产品版本:9.0.30729.146 产品名称:Silverlight Tools RTW 公司:Microsoft Corporation 内部名称:Silverlight_Tools.exe 文件版本:9.0.30729.146 语言:英语(美国) 源文件名:Silverlight_Tools.exe 共5个分卷

    Silverlight_Tools(分卷2)

    产品版本:9.0.30729.146 产品名称:Silverlight Tools RTW 公司:Microsoft Corporation 内部名称:Silverlight_Tools.exe 文件版本:9.0.30729.146 语言:英语(美国) 源文件名:Silverlight_Tools.exe 共5个分卷

    Silverlight_Tools(分卷5)

    产品版本:9.0.30729.146 产品名称:Silverlight Tools RTW 公司:Microsoft Corporation 内部名称:Silverlight_Tools.exe 文件版本:9.0.30729.146 语言:英语(美国) 源文件名:Silverlight_Tools.exe 共5个分卷

    RTW_user_guide

    RTW_user_guide convert matlab/simulink model to c/c++ code

    Win2003+IIS6+PHP5.33(FastCGI)+MySQl5.1.50下安装配置Moodle

    操作系统:Windows 2003 Server SP2 IIS6.0 所需软件:3个 fcgisetup_1.5_x86_rtw mysql-essential-5.1.50-win32 php-5.3.3-Win32-VC9-x86

    My RTW-crx插件

    语言:English (UK) 加载RTW应用 一种存储您访问过的所有国家的方法

    Simulink/ RTW工具箱

    RTW是基于simulink的代码自动生成环境,他能直接根据simulink模块中产生优质的、可移植的代码,并根据目标自动生成多种环境下的程序。包括RTW代码自动生成及实时系统开发环境、xPC目标环境的的应用和dSPace实时系统...

    wpa-supplicant-8-0-8.x-rtw.tar.gz

    wpa_supplicant_8_0_8.x_rtw.tar.gz 源码压缩包,可移植使用

Global site tag (gtag.js) - Google Analytics