StaticResource與DynamicResource

StaticResource與DynamicResource

在XAML常會見到StaticResource與DynamicResource這兩種資源的用法,這兩種資源使用有什麼不同呢?基本上StaticResource與DynamicResource大概有幾種區別:

StaticResource

DynamicResource

靜態套用資源,表示資源只套用一次,之後不管資源如何變化都不會改變。

動態套用資源,只要來源的資源產生變化時就會跟著變化。

不需追蹤資源,耗費較少的系統資源。

需要追蹤資源,耗費較多的系統資源。

不限制資源套用的目標

只能使用在相依屬性上

另外使用StaticResource有點「循序」的意味,也就是說資源必須在使用之前宣告,下面就是一種錯誤的使用:

 

<Window

Background="{StaticResource ImageBrush1}">
<Window.Resources>
<ImageBrush x:Key="ImageBrush1" ImageSource="back.png"/>
</Window.Resources>

由於StaticResource的使用早於資源的宣告,所以這種寫法是不能執行的,在Blend 2中這種錯誤寫法在編輯時期並不會有錯誤的提示,在執行時期就會發生未知的錯誤。而Visual Studio 則在編輯階段時就會提示錯誤,因此若有類似的需要時,應該使用DynamicResource而不是StaticResource。

雖然在程式中套用資源時沒有DynamicResource或StaticResource的參數或屬性可供設定,但是指定資源的方式卻與DynamicResource或StaticResource有關,例如:

 

01 …..
02 namespace ResourceTypeProject
03 {
04      public partial class Window1 : Window
05      {
06          public Window1()
07          {
08             this.InitializeComponent();
09             this.Loaded += new RoutedEventHandler(Window1_Loaded);
10             SolidColorBrush brushResource = new SolidColorBrush(Colors.Blue);
11             Window.Resources.Add("MyBrush", brushResource);
12          }

13       void Window1_Loaded(object sender, RoutedEventArgs e)
14       {
15             btnDyna.SetResourceReference(Button.BackgroundProperty, "MyBrush");
16             btnStatic.Background = (SolidColorBrush)Window.FindResource("MyBrush");
17       }

18       private void btnChange_Click(object sender, RoutedEventArgs e)
19       {
20            Window.Resources["MyBrush"] = new SolidColorBrush(Colors.Red);
21       }

22    }

23 }

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

 

btnDyna.SetResourceReference(Button.BackgroundProperty, "MyBrush");
btnStatic.Background = (SolidColorBrush)Window.FindResource("MyBrush");

這兩行來分別指定Button.Background的資源,btnDyna我們使用SetResoueceReference方法來指定使用資源,這種寫法相當於在XAML使用DynamicResource來套用資源;而btnStatic我們則是使用FindResource方法,將找到的資源轉換型別後直接指定給btnStatic.Background屬性,這種方法等同於使用StaticResource。

執行程式之後結果也如預期一般,btnDyna的背景會隨著資源改變而改變;而btnStatic則不會有這種現象。

clip_image002

使用DynamicResource才會追蹤資源的變化