在WPF中,資源的含義和處理方式與傳統的Win32和Windows Forms資源有所區別。首先,不需要創(chuàng )建.resx文件,只需要在工程中指出資源即可,其它所有的工作都由WPF完成。其次,WPF中的資源不再像.NET中有資源ID,在XAML中引用資源需要使用Uri。最后,在WPF的資源中,幾乎可以包含所有的任意CLR對象,只要對象有一個(gè)默認的構造函數和獨立的屬性。在WPF本身的對象中,可以聲明如下四種對象:Style、Brushes、Templates和DataSource。
在定義具體的資源之前,我們先考慮如下幾個(gè)相關(guān)的問(wèn)題:
1、資源的有效范圍:在WPF中,所有的框架級元素(FrameworkElement或者FrameworkContentElement)都有一個(gè)Resource屬性。也就是說(shuō)。我們可以在所有這類(lèi)元素的Resource子元素中定義屬性。在實(shí)踐中,最常用的三種就是三種根元素所對應的資源:Application、Page和Window。顧名思義,在Application根元素下定義的資源將在當前整個(gè)應用程序中可見(jiàn),都可以訪(fǎng)問(wèn)。在Page和Window中定義的元素只能在對應的Page和Window中才能訪(fǎng)問(wèn)。
2、資源加載形式:WPF提供了兩種資源類(lèi)型:Static資源和Dynamic資源。
兩種的區別主要有兩點(diǎn):A)、Static資源在編譯時(shí)決議,而Dynamic資源則是在運行時(shí)決議。B)、Static資源在第一次編譯后即確定了相應的對象或者值。此后不能對其進(jìn)行修改,即使修改成功也是沒(méi)有任何意義的,因為其它使用資源的對象不會(huì )得到通知。Dynamic資源不同,它只有在運行過(guò)程中真正需要時(shí),才會(huì )在資源目標中查找。所以我們可以動(dòng)態(tài)的修改Dynamic資源。顯而易見(jiàn),Dynamic資源的運行效率將比Static資源低。
3、不管是Static資源還是Dynamic資源,所有的資源都需要設置Key屬性:x:Key=”KeyName”。因為WPF中的資源沒(méi)有資源ID,需要通過(guò)資源Key來(lái)標識以方便以后訪(fǎng)問(wèn)資源。范圍資源時(shí)我們根據資源的類(lèi)型使用StaticResource或者DynamicResource標記擴展。
好了,對WPF中的資源所有了解后,我們看一些簡(jiǎn)單的例子:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<StackPanel.Resources>
<SolidColorBrush x:Key="MyBrush" Color="gold"/>
</StackPanel.Resources>
<TextBlock Foreground="{StaticResource MyBrush}" Text="Text"/>
</StackPanel>
</Window>
在這個(gè)例子中,我們在StackPanel元素的Resource子元素中定義了一個(gè)SolidColorBrush資源。然后在后面通過(guò)StaticResouce標記擴展,利用前面的x:Key屬性訪(fǎng)問(wèn)定義好的資源。
資源除了可以在XAML聲明外,還可以通過(guò)代碼進(jìn)行訪(fǎng)問(wèn)控制。支持Resource屬性的對象都可以通過(guò)FindResource、以及Resource.Add和Resource.Remove進(jìn)行控制:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Window.Resouce>
<SolidColorBrush x:Key="MyBrush" Color="gold"/>
</Window.Resouce>
</Window>
我們先在代碼XAML的Window.Resource中定義了一個(gè)MyBrush。在代碼中可以如下對其進(jìn)行訪(fǎng)問(wèn):
SolidColorBrush brush = this.FindResource("MyBrush") as SolidColorBrush;
如果需要進(jìn)一步修改或者刪除資源時(shí),可如下編碼:
this.Resouce.Remove(“MyBrush”); //刪除MyBrush資源
this.Resouce.Add(“MyBrush”); //重新動(dòng)態(tài)添加資源
說(shuō)明:以上三處的this引用都是特指我們定義MyBrush的元素Window。讀者朋友可根據實(shí)際情況修改。
聯(lián)系客服