經過之前的介紹,相信大家已經對Behavior有了初步的概念,但是對於怎麼寫出一個自己的Behavior,應該還是比較沒Fu吧!?
這篇就來跟大家介紹Behavior程式的結構,順便帶大家來實作一個「能用滑鼠滾輪控制放大縮小倍率的放大鏡Behavior」吧!!
經過之前的介紹,相信大家已經對Behavior有了初步的概念,但是對於怎麼寫出一個自己的Behavior,應該還是比較沒Fu吧!?
這篇就來跟大家介紹Behavior程式的結構,順便帶大家來實作一個「能用滑鼠滾輪控制放大縮小倍率的放大鏡Behavior」吧!!
基本上,當你透過Blend建立一個Behavior的Class之後,它預設的程式內容如下:
從class的宣告行,我們可以看出Behavior是繼承了System.Windows.Interactivity中的Behavior<DependencyObject>的類別,我們可以透過修改< DependencyObject >來的方式來設定該Behavior能寄生(講附身好像比較貼切)的型別(必需是衍生自DependencyObject的類別),例如修改成Behavior<Button>則代表該Behavior只能附身在Button的 身上,而被附身的物件實體,則可以透過名為AssociatedObject的Property來存取。
除此之外,Behavior必需override兩個重要的Method,第一個是OnAttached,我們得透過這個Method定義出當目標物件被附身之後,它必需處理的事件有哪些;另一個是OnDetaching,一看就知道和OnAttached相反,這邊定義的是當附身解除之後,要善後的動作。
除了上述兩個Method之外,剩下的就是自由發揮創意的時間了,我們可以定義額外的Method,來處理OnAttached中事件觸發的EventListener,或是實作ICommand,以供MVVM中EvnetListener的Binding。
直接以前面提到的放大鏡為例:
因為我希望到時候所有繼承自FrameworkElement的物件都能被放大鏡附身,因此我把Behavior<T>設為Behavior<FrameworkElement>,而Blend中也內建了一個放大鏡的PixelShaderEffect(這個之後會再找機會向大家介紹),我就直接拿它來用。而我希望當物件被附身之後,可以透過滑鼠移動來改變放大鏡的位置,並且可以透過滑鼠滾輪來改變放大的倍率,因此我在OnAttached Method中設定了兩個EventListener,程式碼有點長,但是其實並不複雜吧!?就這樣,我就做完一個擁有放大鏡效果的Behavior囉!!
最後來看看實作出來的效果吧!!(若想體驗透過滾輪控制縮放程度的功能--請點此開啟新視窗)
最後的最後,附上原始碼,請自行取用: