已知WPF的Image元素只能顯示GIF圖片的第一幀,而MediaElement不能加載作為資源或內嵌的資源的GIF圖片,所以網上有幾種實現方法。
GifImage
GifImage繼承自FrameworkElement,添加了Source、Stretch、StretchDirection依賴項屬性,用法就跟標準Image元素差不多。從GIF里分解出各幀及其延續時間后,我在OnRender里自行繪制,并啟動DispatcherTimer計時,以便按時繪制下一幀。
解析GIF需要GifFormat類的幫助。GifFormat的構造函數需要Stream對象,構造函數認為從該Stream對象中可以讀到gif文件,然后按字節解析。
GIF圖片是由很多幀構成的,每一幀有延續時間、處置方法、左邊、上邊等屬性,當然還有最重要的圖像數據。GifFrame類就代表GIF圖片里的幀。
經GifFormat解析后的數據可由LogicalScreenWidth、LogicalScreenHeight和GetFrames方法獲得。
每當設置Source屬性,如果是gif圖片,就會重新創建一個新的GifFormat,然后啟動timer。
當然,Source URI的方案是多種多樣的,GifImage支持http、ftp、file、pack。
顯示GIF的兩個重點在MeasureOverride和OnRender方法,它們考慮了Stretch、StretchDirection、Width、Height等屬性。
WpfAnimatedGif
一個簡單的在WPF中顯示GIF圖片的庫使用非常簡單:在XAML中,替換Source屬性,設置AnimatedSource附加屬性到想要的圖片Windowx:Class=WpfAnimatedGif.Demo.MainWindowxmlns=http://schemas....