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