StaticResource與DynamicResource
在XAML常會見到StaticResource與DynamicResource這兩種資源的用法,這兩種資源使用有什麼不同呢?基本上StaticResource與DynamicResource大概有幾種區別:
StaticResource | DynamicResource |
靜態套用資源,表示資源只套用一次,之後不管資源如何變化都不會改變。 | 動態套用資源,只要來源的資源產生變化時就會跟著變化。 |
不需追蹤資源,耗費較少的系統資源。 | 需要追蹤資源,耗費較多的系統資源。 |
不限制資源套用的目標 | 只能使用在相依屬性上 |
另外使用StaticResource有點「循序」的意味,也就是說資源必須在使用之前宣告,下面就是一種錯誤的使用:








由於StaticResource的使用早於資源的宣告,所以這種寫法是不能執行的,在Blend 2中這種錯誤寫法在編輯時期並不會有錯誤的提示,在執行時期就會發生未知的錯誤。而Visual Studio 則在編輯階段時就會提示錯誤,因此若有類似的需要時,應該使用DynamicResource而不是StaticResource。
雖然在程式中套用資源時沒有DynamicResource或StaticResource的參數或屬性可供設定,但是指定資源的方式卻與DynamicResource或StaticResource有關,例如:

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

在程式一開始時我們定義了一個資源-MyBrush,在Window載入完成後分別以:


這兩行來分別指定Button.Background的資源,btnDyna我們使用SetResoueceReference方法來指定使用資源,這種寫法相當於在XAML使用DynamicResource來套用資源;而btnStatic我們則是使用FindResource方法,將找到的資源轉換型別後直接指定給btnStatic.Background屬性,這種方法等同於使用StaticResource。
執行程式之後結果也如預期一般,btnDyna的背景會隨著資源改變而改變;而btnStatic則不會有這種現象。
使用DynamicResource才會追蹤資源的變化 |