在許多用戶框架中(特別是WPF之前的框架,如Windows表單和MFC),開發人員必須從頭構建自己的影片系統,最常用的技術是結合使用計時器和一些自定義的繪圖邏輯,WPF通過自帶的基于屬性的影片系統,改變了這種情況,接下來的兩節將描述這兩者之間的區別,
一、基于時間的影片
假如需要旋轉Windows表單應用程式中的About對話框中的一塊文本,下面是構建該解決方案的傳統方法:
(1)創建周期性觸發的計時器(例如,每隔50毫秒觸發一次),
(2)當觸發計時器時,使用事件處理程式計算一些與影片相關的細節,如新的旋轉角度,然后使視窗的一部分或者整個視窗無效,
(3)不久后,Windows將要求視窗重新繪制自身,觸發自定義的繪圖代碼,
(4)在自定義的繪圖代碼中,渲染旋轉后的文本,
盡管這個基于計時器的解決方案不難實作,但將它繼承到普通的應用程式視窗中卻非常麻煩,下面是列出這種解決方案存在的一些問題:
- 繪制像素而不是控制元件,為旋轉Windows表單中的文本,需要低級的GDI+繪圖支持,GDI+易于使用,但卻不能與普通的視窗元素(如按鈕、文本框和標簽等)很好地相互協調,所以需要將影片內容二環控制元件相互分離,并且不能在影片中包含任何用戶互動元素,將無法旋轉按鈕,
- 假定單一影片,如果決定希望同時運行兩個影片,就需要重新撰寫所有影片代碼——并且變得更復雜,在這方面WPF顯得更加強大,它可以構建比單一簡單影片更復雜的影片,
- 影片幀率是固定的,計時器設定完全域定了幀率,如果改變時間間隔,可能需要修改影片代碼(取決于執行計算的方式),而且,選擇的固定幀率對于特定的計算機顯卡硬體不一定理想,
- 復雜影片需要指數級增長的更復雜的代碼,旋轉文本的示例非常簡單,但如果想沿著一定路徑移動比較小的矢量圖畫,就困難得多了,在WPF中,甚至是復雜的影片也能夠在XAML中定義(而且可以使用第三方設計工具生成影片),
基于計時器的影片仍存在一些缺點:導致代碼不是很靈活,對于復雜的效果會變得雜亂無章,并且不鞥能得到最佳性能,
二、基于屬性的影片
WPF提供了一個更高級的模型,通過該模型可以只關注影片的定義,而不必考慮它們的渲染方式,這個模型基于依賴項屬性基礎架構,本質上,WPF影片只不過是在一定時間間隔內修改依賴項屬性值得一種方式,
例如,為了增大或縮小按鈕,可以在影片中修改按鈕的寬度,為使按鈕閃爍,可修改用于按鈕背景的LinearGradientBrush畫刷的屬性,創建正確影片的秘密在于決定需要修改什么屬性,
如果希望實作不能通過修改屬性實作的其他變化,上述方法就行不通,例如,不能將添加或洗掉元素作為影片的一部分,同樣,不要求WPF在開始場景和結束場景之間執行過渡(盡管一些靈活的變通方法可以模擬這種效果),最后,只能依賴項屬性應用影片,因為只有依賴項屬性應用影片,因為只有依賴項屬性使用動態的屬性識別系統,而該系統將影片考慮在內,
乍一看,WPF影片關注屬性的本質看起來有很大的局限性,然而,當使用WPF進行作業時,就會發現它的功能非常強大,實際上,使用每個元素都支持的公共屬性可以實作非常多得影片效果,
但許多情況下,基于屬性的影片系統不能作業,作為經驗法則,基于屬性的影片系統是為普通的Windows應用程式添加動態的極佳方式,例如,如果希望潤色互動性購物工具的前端,基于屬性的影片系統將會很完美地作業,然而,如果需要作為應用程式的核心目標蘇菲使用影片,并且希望影片在應用程式的整個生命周期中持續運行,可能需要更靈活的、更強大的技術,例如,如果正在創建基本游戲或為模型碰撞使用復雜的物理計算,就需要更好地控制影片,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/4480.html
標籤:WPF
