成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解Silverlight 3.0 RTW新特性

開發 后端
Silverlight 3.0 RTW新特性中引入了一個人們期待已久的事件 -- 鼠標滾動事件,處理這個事件非常簡單,只需要根據方向指定正負值和滾動的數量即可。本文主要介紹如何創建行為,如何使用鼠標滾動事件,以及如何將其添加到可滾動的控件上,以便使用鼠標滾輪。

在Silverlight 3.0 RTW新特性中,展示一個鼠標滾動事件的示例只需要幾行代碼即可,我認為大部分人都可以在幾分鐘內做好,并理解它是如何工作的。因此我決定將這個事件和Expression Blend中引入的新行為一起合并成一個例子進行介紹。

行為是什么?

你可能曾經在ASP.NET Ajax框架中使用過行為,說得簡單點這里的行為就是ASP.NET Ajax語法的Silverlight實現,允許創建可復用的和可連接到HTML控件的行為。(Silverlight 3.0 RTW新特性讓操作簡單的和手工具)

從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. // 在這里添加實現代碼  

由于我們是要擴展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. /// < summary> 
  11. /// Called when the behavior is being detached from its AssociatedObject, but before it has actually occurred.  
  12. /// < /summary> 
  13. /// < remarks>Override this to unhook functionality from the AssociatedObject.< /remarks> 
  14. protected override void OnDetaching()  
  15. {  
  16. this.AssociatedObject.MouseWheel -new MouseWheelEventHandler(AssociatedObject_MouseWheel);  
  17. base.OnDetaching();  

現在行為已經準備好連接到對象,但它沒有做任何事情,我們需要為可滾動組件實現滾動。

滾動可滾動的組件 -- 并非如此簡單

由于沒有通用的滾動接口,即使為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.  /// < summary> 
  7.  /// Called after the behavior is attached to an AssociatedObject.  
  8.  /// < /summary> 
  9.  /// < remarks>Override this to hook up functionality to the AssociatedObject.< /remarks> 
  10.  protected override void OnAttached()  
  11.  {  
  12.  this.Peer = FrameworkElementAutomationPeer.FromElement(this.AssociatedObject);  
  13.  if (this.Peer == null)  
  14.  this.Peer = FrameworkElementAutomationPeer.CreatePeerForElement(this.AssociatedObject);  
  15.  this.AssociatedObject.MouseWheel += new MouseWheelEventHandler(AssociatedObject_MouseWheel);  
  16.  base.OnAttached();  
  17.  } 

如果控件已經創建了自動化接口,我們首先來研究一下它,如果接口不存在,我們需要先創建,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.  int direction = Math.Sign(e.Delta);  
  10.  ScrollAmount scrollAmount =  
  11.  (direction < 0) ? ScrollAmount.SmallIncrement : ScrollAmount.SmallDecrement;  
  12.  if (this.Peer != null)  
  13.  {  
  14.  IScrollProvider scrollProvider =  
  15.  this.Peer.GetPattern(PatternInterface.Scroll) as IScrollProvider;  
  16.  bool shiftKey = (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift;  
  17. if (scrollProvider != null && scrollProvider.VerticallyScrollable && !shiftKey)  
  18.  scrollProvider.Scroll(ScrollAmount.NoAmount, scrollAmount);  
  19.  else if (scrollProvider != null && scrollProvider.VerticallyScrollable && shiftKey)  
  20.  scrollProvider.Scroll(scrollAmount, ScrollAmount.NoAmount);  
  21.  }  
  22.  } 

我們獲取了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.  ... omissis ...  
  10.  < data:DataGrid Grid.Column="" Grid.Row="0" ItemsSource="{Binding DataItems}" Margin="20"> 
  11.  < i:Interaction.Behaviors> 
  12.  < local:MouseWheelScrollBehavior /> 
  13.  < /i:Interaction.Behaviors> 
  14.  < /data:DataGrid> 

在UserControl中,我們聲明了要使用的命名空間,在這個例子中,"i"代表交互,"local"指的是融入了新行為的本地類,在第二部分中我們將行為連接到DataGrid了,將行為連接到ScrollViewer或ListBox的代碼非常類似,運行這個項目,我們在DataGrid上就可以使用鼠標滾輪了。

Silverlight 3.0 RTW新特性小結

本文介紹的Silverlight 3.0 RTW新特性非常有實用價值,幾乎適用于所有的可滾動控件,但ComboBox是個例外,因為它沒有直接實現IScrollProvider接口,缺點是只能工作在Windows上,這是一個較大的問題,但目前并沒有解決辦法,因為它是目前通過編程實現滾動的唯一方法,此外我還注意到MouseWheel事件只能在Windows下IE和Firefox (非Windows模式)中工作,這是由Safari和Firefox 的架構決定的,唯一變通的方法是使用DOM事件。

【編輯推薦】

  1. 微軟Silverlight 3挑戰Adobe AIR
  2. RIA大戰在即 微軟Silverlight勝算幾何
  3. 圖解Silverlight 3的7個新功能
  4. Flash與Silverlight多領域實測對比
  5. 微軟宣稱Silverlight裝機量超過三億
責任編輯:彭凡 來源: IT專家網
相關推薦

2012-08-28 09:54:35

SilverlightRapidSLSilverlight

2011-07-27 16:12:35

Linux KerneLinux內核

2009-08-27 16:24:48

擴展方法C# 3.0新特性

2025-05-07 03:15:00

NacosAPIMCP

2013-07-29 15:13:35

2010-12-06 09:33:21

Silverlight

2009-12-29 16:21:46

silverlight

2009-07-08 09:35:53

Java ServleServlet 3.0

2009-08-31 14:45:07

Visual C# 3

2009-06-29 17:42:03

Tapestry5新特

2012-01-09 16:00:56

2010-04-30 09:19:05

Servlet 3.0

2009-08-24 17:55:44

C#3.0新特性

2024-04-18 08:04:47

ElectronChrome升級

2011-02-21 16:39:47

Android 2.3Android R5

2010-06-23 15:29:52

Eclipse 3.6Java

2017-11-13 08:44:19

Android Stu移動數據庫Kotlin

2021-04-02 10:30:18

Vue3.0前端代碼

2010-07-29 09:03:18

Silverlight

2010-01-14 09:15:07

Java EE 6Servlet 3.0異步處理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产乱码久久久久久闺蜜 | 久久一区二区av | 国产欧美三区 | 一本在线 | 国产a一区二区 | 亚洲精品久久久久久久久久吃药 | 日本一区二区高清视频 | 亚洲性人人天天夜夜摸 | 亚洲精品视频在线 | 国产一区二区三区四区五区3d | 国产伦一区二区三区久久 | 成人免费看片 | 国产日韩免费视频 | 亚洲 欧美 综合 | 亚洲最新在线视频 | 99精品视频在线观看 | 精品日韩| 一区二区三区久久久 | 国产高清自拍视频在线观看 | 成人免费在线观看视频 | 亚洲av毛片| 亚州精品天堂中文字幕 | 亚洲成人a v | 亚洲综合久久精品 | 欧美日韩精品中文字幕 | 天天澡天天操 | 一区二区三区不卡视频 | 91在线影院 | 欧美国产激情二区三区 | 在线免费观看黄色av | 天天操夜夜操 | 亚洲最大成人综合 | 国产一级特黄aaa大片评分 | 亚洲天天干| 久久精品久久精品久久精品 | 一区二区精品 | 成人在线电影网站 | 亚洲精品一区在线 | 久久夜色精品国产 | 欧美一级二级视频 | av在线免费观看网址 |