日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解Silverlight3.0RTW新特性

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

創(chuàng)新互聯(lián)公司專注于永和網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供永和營銷型網(wǎng)站建設(shè),永和網(wǎng)站制作、永和網(wǎng)頁設(shè)計(jì)、永和網(wǎng)站官網(wǎng)定制、重慶小程序開發(fā)公司服務(wù),打造永和網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供永和網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

行為是什么?

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

從Blend 3 Beta版開始引入行為的概念,可以在設(shè)計(jì)窗口中拖動(dòng)內(nèi)置的行為,增加圖形元素的活力,進(jìn)入Asset文件夾,在這里可以找到控件、效果、資源和其它東西,現(xiàn)在又多了一個(gè)行為卡片。

Expression Blend 3.0 引入了許多行為類型,行為< T>是其中最簡單的了,適用于DependencyObject,行為可以修改控件的外觀,添加元素,修改屬性或處理一個(gè)或多個(gè)事件。MouseDragElementBehavior就是一個(gè)活生生的例子,它連接鼠標(biāo)事件,讓元素可以在頁面中拖動(dòng)。

編寫一個(gè)行為

編寫一個(gè)行為是一件很簡單的事情,行為是行為< T>的類擴(kuò)展,因此首先要做的是引用C:\Program Files\Microsoft SDKs\Expression\Blend 3\Interactivity\Libraries\Silverlight目錄下的Microsoft.Expression.Interactions.dll和System.Windows.Interactivity.dll。如果你從Blend 3.0添加一個(gè)現(xiàn)有的行為,那這些動(dòng)態(tài)庫會(huì)自動(dòng)引用到項(xiàng)目中。

引用添加好后,就可以創(chuàng)建類了:

 
 
 
  1.  public class MouseWheelScrollBehavior : Behavior< Control> 
  2. {
  3. // 在這里添加實(shí)現(xiàn)代碼
  4. }

由于我們是要擴(kuò)展Silverlight中可滾動(dòng)的組件,我們需要?jiǎng)?chuàng)建一個(gè)可以連接到Control類的類型,在Silverlight中沒有通用的用于可滾動(dòng)組件(如ScrollViewer、DataGrid和DataGrid)的類,這就需要自己想辦法處理才行,我們將在后面進(jìn)行介紹,目前先分析一下如何創(chuàng)建一個(gè)行為。(微軟Silverlight中加入Smooth Streaming)

接下來要做的是在目標(biāo)對象上連接MouseWheel事件,當(dāng)我們完成行為類的擴(kuò)展后,我們有兩個(gè)辦法來處理連接和釋放目標(biāo)上的行為:將行為連接到對象上時(shí)調(diào)用OnAttached,釋放對象上的行為時(shí)使用OnDetaching。OnAttached和OnDetaching是連接和釋放公共事件的理想選擇,目標(biāo)對象是通過行為< 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();
  18. }

現(xiàn)在行為已經(jīng)準(zhǔn)備好連接到對象,但它沒有做任何事情,我們需要為可滾動(dòng)組件實(shí)現(xiàn)滾動(dòng)。

滾動(dòng)可滾動(dòng)的組件 -- 并非如此簡單

由于沒有通用的滾動(dòng)接口,即使為ScrollViewer創(chuàng)建一個(gè)行為比較簡單,但為DataGrid或ListBox創(chuàng)建滾動(dòng)行為卻并不簡單。

我在http://blog.thekieners.com/2009/04/06/how-to-enable-mouse-wheel-scrolling-in-silverlight-without-extending-controls/發(fā)現(xiàn)有人曾經(jīng)寫過一篇文章介紹如何使用Automation API而不擴(kuò)展控件實(shí)現(xiàn)鼠標(biāo)滾動(dòng)。大家可以去了解一下。這里我們需要知道的是Automation API提供了一個(gè)IScrollProvider接口,因此我們需要修改OnAttached方法,為連接對象創(chuàng)建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.  }

如果控件已經(jīng)創(chuàng)建了自動(dòng)化接口,我們首先來研究一下它,如果接口不存在,我們需要先創(chuàng)建,AutomationPeer作為一個(gè)成員屬性保存,使用MouseWheel事件時(shí)會(huì)使用到它,下面是滾動(dòng)目標(biāo)對象的示例代碼:

 
 
 
  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后需要提取出滾動(dòng)的方向,否則我們就不能指定目標(biāo)滾動(dòng)的像素?cái)?shù)量,但ScrollAmount可能是SmallIncrement或SmallDecrement(或LargeIncrement,LargeDecrement),因此使用方向我們可以確定是遞增還是遞減。

由于控件既可以橫向滾動(dòng)也可以縱向滾動(dòng),我決定檢查換檔鍵是否被按下,如果按下就實(shí)現(xiàn)橫向滾動(dòng),***在IScrollProvider中使用Scroll方法,不需要檢查邊界。

使用行為

使用Blend應(yīng)用行為的操作非常簡單,Blend資產(chǎn)庫會(huì)掃描項(xiàng)目中所有的類,并顯示出來,因此只需要拖動(dòng)行為到滾動(dòng)組件上就可以應(yīng)用行為了,我們需要學(xué)習(xí)的是通過編碼應(yīng)用行為,下面是一個(gè)例子:

 
 
 
  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中,我們聲明了要使用的命名空間,在這個(gè)例子中,"i"代表交互,"local"指的是融入了新行為的本地類,在第二部分中我們將行為連接到DataGrid了,將行為連接到ScrollViewer或ListBox的代碼非常類似,運(yùn)行這個(gè)項(xiàng)目,我們在DataGrid上就可以使用鼠標(biāo)滾輪了。

Silverlight 3.0 RTW新特性小結(jié)

本文介紹的Silverlight 3.0 RTW新特性非常有實(shí)用價(jià)值,幾乎適用于所有的可滾動(dòng)控件,但ComboBox是個(gè)例外,因?yàn)樗鼪]有直接實(shí)現(xiàn)IScrollProvider接口,缺點(diǎn)是只能工作在Windows上,這是一個(gè)較大的問題,但目前并沒有解決辦法,因?yàn)樗悄壳巴ㄟ^編程實(shí)現(xiàn)滾動(dòng)的唯一方法,此外我還注意到MouseWheel事件只能在Windows下IE和Firefox (非Windows模式)中工作,這是由Safari和Firefox 的架構(gòu)決定的,唯一變通的方法是使用DOM事件。


當(dāng)前題目:詳解Silverlight3.0RTW新特性
本文地址:http://www.5511xx.com/article/djccppj.html