資源是保存在可執(zhí)行文件中的一種不可執(zhí)行數(shù)據(jù)。通過資源我們可以包含圖像、字符串等等幾乎是任意類型的數(shù)據(jù)。如此重要的功能,.NET Framework當(dāng)然也是支持的,其中內(nèi)建有資源創(chuàng)建、定位、打包和部署的工具。在.NET中可以創(chuàng)建.resx和.resources文件。其中.resx由XML項(xiàng)組成。.resx只是一種中間格式,不能被應(yīng)用程序直接使用,它必須用工具轉(zhuǎn)換為.resource格式。
在WPF中,資源的含義和處理方式與傳統(tǒng)的Win32和Windows Forms資源有所區(qū)別。首先,不需要?jiǎng)?chuàng)建.resx文件,只需要在工程中指出資源即可,其它所有的工作都由WPF完成。其次,WPF中的資源不再像.NET中有資源ID,在XAML中引用資源需要使用Uri。最后,在WPF的資源中,幾乎可以包含所有的任意CLR對(duì)象,只要對(duì)象有一個(gè)默認(rèn)的構(gòu)造函數(shù)和獨(dú)立的屬性。在WPF本身的對(duì)象中,可以聲明如下四種對(duì)象:Style、Brushes、Templates和DataSource。 在定義具體的資源之前,我們先考慮如下幾個(gè)相關(guān)的問題: 1、資源的有效范圍:在WPF中,所有的框架級(jí)元素(FrameworkElement或者FrameworkContentElement)都有一個(gè)Resource屬性。也就是說。我們可以在所有這類元素的Resource子元素中定義屬性。在實(shí)踐中,最常用的三種就是三種根元素所對(duì)應(yīng)的資源:Application、Page和Window。顧名思義,在Application根元素下定義的資源將在當(dāng)前整個(gè)應(yīng)用程序中可見,都可以訪問。在Page和Window中定義的元素只能在對(duì)應(yīng)的Page和Window中才能訪問。 2、資源加載形式:WPF提供了兩種資源類型:Static資源和Dynamic資源。 兩種的區(qū)別主要有兩點(diǎn):A)、Static資源在編譯時(shí)決議,而Dynamic資源則是在運(yùn)行時(shí)決議。B)、Static資源在第一次編譯后即確定了相應(yīng)的對(duì)象或者值。此后不能對(duì)其進(jìn)行修改,即使修改成功也是沒有任何意義的,因?yàn)槠渌褂觅Y源的對(duì)象不會(huì)得到通知。Dynamic資源不同,它只有在運(yùn)行過程中真正需要時(shí),才會(huì)在資源目標(biāo)中查找。所以我們可以動(dòng)態(tài)的修改Dynamic資源。顯而易見,Dynamic資源的運(yùn)行效率將比Static資源低。 3、不管是Static資源還是Dynamic資源,所有的資源都需要設(shè)置Key屬性:x:Key=”KeyName”。因?yàn)?/span>WPF中的資源沒有資源ID,需要通過資源Key來標(biāo)識(shí)以方便以后訪問資源。范圍資源時(shí)我們根據(jù)資源的類型使用StaticResource或者DynamicResource標(biāo)記擴(kuò)展。 好了,對(duì)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è)例子中,我們?cè)?/span>StackPanel元素的Resource子元素中定義了一個(gè)SolidColorBrush資源。然后在后面通過StaticResouce標(biāo)記擴(kuò)展,利用前面的x:Key屬性訪問定義好的資源。 資源除了可以在XAML聲明外,還可以通過代碼進(jìn)行訪問控制。支持Resource屬性的對(duì)象都可以通過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。在代碼中可以如下對(duì)其進(jìn)行訪問: SolidColorBrush brush = this.FindResource("MyBrush") as SolidColorBrush; 如果需要進(jìn)一步修改或者刪除資源時(shí),可如下編碼: this.Resouce.Remove(“MyBrush”); //刪除MyBrush資源 this.Resouce.Add(“MyBrush”); //重新動(dòng)態(tài)添加資源 說明:以上三處的this引用都是特指我們定義MyBrush的元素Window。讀者朋友可根據(jù)實(shí)際情況修改。 |
|