WPF學習日誌 ~ 變換Form的背景圖 ~

Note:本篇工具使用VS2008,.Net framework版本3.5
這篇功能測試是每秒會變換Form的背景圖片,話先說在前頭,這篇單純的只是熟悉一下WPF相關物件的使用方式,不會看到WPF的"特異功能",單就功能上來看VS2005也是很輕易的可以完成的。
首先,有些東西要了解一下,像是WPF中並沒有直接提供Timer的控制項,那怎麼做呢?請參考下面這篇
請教WPF form沒有Timer元件了嗎??
好,下面我們來看看程式碼吧
''宣告Timer物件
Dim myT As Threading.DispatcherTimer
''宣告Image物件
Dim img As Image
Dim B As BitmapImage

Dim ImagePath() As String
Dim Count As Integer = 0
Dim u As Uri
Dim R As New Random

Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
''設定標題列文字
Me.Title = "WPF Text"
''取得圖片檔案路徑
ImagePath = IO.Directory.GetFiles("D:\圖檔\JPG\App")
u = New Uri(ImagePath(0))
B = New BitmapImage
B.BeginInit()
B.UriSource = u
B.EndInit()

img = New Image
img.Source = B
img.Stretch = Stretch.UniformToFill
Me.Content = img
''Timer相關設定
myT = New Threading.DispatcherTimer
myT.Interval = New TimeSpan(0, 0, 1)
AddHandler myT.Tick, AddressOf Timer_Tick
myT.Start()
End Sub

Private Sub Timer_Tick(ByVal sender As Object, ByVal e As EventArgs)
On Error Resume Next
If (Count + 1) > (ImagePath.Length - 1) Then
Count = 0
Else
Count += 1
End If
u = New Uri(ImagePath(Count))
B = New BitmapImage
B.BeginInit()
B.UriSource = u
B.EndInit()
img.Source = B
''亂數旋轉圖片的角度
Randomize()
img.LayoutTransform = New RotateTransform(R.Next(1, 100))
End Sub
值得一提的是,在指定BitmapImage的UriSource時,前後我們都會加上Init相關的動作,你可以將這兩行註解掉看看有什麼不同。
相關參考

2008.3.21 編輯
Kevin大留言提到,在上面程式碼中,取得圖片路徑的程式碼
ImagePath = IO.Directory.GetFiles("D:\圖檔\JPG\App")
由於瀏覽過圖片的話會在該目錄下多了一個thumbs.db的檔案,建議修改為下面方式
ImagePath = IO.Directory.GetFiles("D:\圖檔\JPG\App","*.jpg")
請各位自行修改了~感謝Kevin大的提醒 ~

留言

匿名表示…
謝謝bauann的解說!

發現程式中有兩個地方有問題:
1、ImagePath = IO.Directory.GetFiles("D:\圖檔\JPG\App")
這裡,如果App資料夾中的圖檔有被觀看過,Windows系統似乎會多增加一個thumbs.db的檔案,因而會造成ImagePath的計數錯誤。
若資料夾中的副檔名皆為.jpg,那,改寫成下面這樣或許會比較好:
ImagePath = IO.Directory.GetFiles("D:\圖檔\JPG\App", "*.jpg")

2、If (Count + 1) > (ImagePath.Length - 1) Then
我想,你是否和我一樣,被thumbs.db的干擾影響,才用上面那樣寫來想避開錯誤。
其實,用If Count + 1 = ImagePath.Length Then就可以了

感謝你,原來VB2008還有WPF這樣的好東西可以研究!
匿名表示…
還有啊,這WPF的繪圖功能真是帥呆了!

剛剛將程式改為:
myT.Interval = New TimeSpan(0, 0, 0, 0, 1)

結果,圖片飛快的變換,而我打開Windows工作管理員來看,CPU使用率幾乎是0!這在VB2005的WinForm中,根本是不可能的事!
bauann寫道…
Hi,Kevin
是的,被你一提我才想到沒有提到這個部分,thumbs.db確實會造成程式的異常,這個部分用您所提的
ImagePath = IO.Directory.GetFiles("D:\圖檔\JPG\App", "*.jpg")
這個方式會好些,感謝您~
bauann寫道…
WPF是利用DirectX去做繪圖的動作,所以有些東西會直接操作到繪圖晶片上面(好像是叫GPU吧,忘了),速度會比較快 ~
之前看一些sample,有做相簿的應用程式,或是像翻閱雜誌那樣的介面,超屌的~
下面這邊有些vedio可以神遊一下
http://windowsclient.net/learn/

這個網誌中的熱門文章

開啟cshtml檔案時,出現『並未將物件參考設定為物件執行個體』的錯誤訊息

無法設定中斷點 尚未載入符號檔

DataGridView欄位計算總合