在前一個(gè)Post當(dāng)中,我從資源編譯行為的角度討論了WPF中的資源。但是,不管是Resource還是Content都是在編譯時(shí)聲明資源。如果我們打破這個(gè)限制,不希望指定完全確認(rèn)的資源地址。WPF提供了一種類似IE地址定位的抽象,它根據(jù)應(yīng)用程序部署的位置決議。
WPF將應(yīng)用程序的起源地點(diǎn)進(jìn)行概念上的抽象。如果我們的應(yīng)用程序位于http://yilinglai.cnblogs.com/testdir/test.application。我們應(yīng)用程序的起源地點(diǎn)是http://yilinglai.cnblogs.com/testdir/,那么我們就可以在應(yīng)用程序中這樣指定資源位置: <Image Source=”pack://siteoforigin:,,,/Images/Test.JPG”/> 通過這種包裝的Uri,使用資源的引用更加靈活。那么,這種類似Internet應(yīng)用程序的資源包裝Uri指定方式有什么優(yōu)點(diǎn)呢? 1)、應(yīng)用程序Assembly建立后,文件也可被替代。 2)、可以使文件只在需要使才被下載。 3)、編譯應(yīng)用程序時(shí),我們不需要知道文件的內(nèi)容(或者文件根本不存在)。 4)、某些文件如果被嵌入到應(yīng)用程序的Assembly后,WPF將不能加載。比如Frame中的HTML內(nèi)容,Media文件。 這里的pack://其實(shí)是一種URI(Uniform Resource Identifiers)語法格式。pack://<authority><absolute_path>,其中的authority部分是一個(gè)內(nèi)嵌的URI。注意這個(gè)URI也是遵守RFC 2396文檔聲明的。由于它是被嵌入到URI當(dāng)中,因此一些保留字符必須被忽略。在我們前面的例子中,斜線(”/”)被逗號(hào)(”,”)代替。其它的字符如”%”、”?”都必須忽略。 前面例子中的siteoforigin可以理解為一種authority的特例。WPF利用它抽象了部署應(yīng)用程序的原始站點(diǎn)。比如我們的應(yīng)用程序在C:\App,而在相同目錄下有一個(gè)Test.JPG文件,訪問這個(gè)文件我們可以用硬編碼URI file:///c:/App/Test.JPG。另外一種方法就是這種抽象性:pack://siteoforigin:,,/Test.JPG。這種訪問方法的便利是不言而喻的!在XPS文檔規(guī)范中,對(duì)URI有更好的說明。有興趣朋友可以在此下載。 也許你看到現(xiàn)在對(duì)此的理解有些問題。不用太著急,隨著你對(duì)WPF越來越熟悉,會(huì)有更多的體會(huì)。對(duì)于WPF的新手(我也是),對(duì)于此點(diǎn)不必過度糾纏。因?yàn)?/span>WPF的Application類中提供了一些有用的方法: Application.GetResourceStream (Uri relativeUri); Application.GetContentStream(Uri relativeUri); Application.GetRemoteStream (Uri relativeUri); 通過使用這些函數(shù),隱藏了URI定位的細(xì)節(jié)。從這些函數(shù)的名稱我們可以看出,它們分別對(duì)應(yīng)于我在前面介紹的三種類型:Content、Resource和SiteofOrigin。 最后,簡單的說明一下另一種使用資源的方式,直接定義資源,不使用任何的屬性,具體的用法看例子就明白了: <StackPanel Name="sp1"><StackPanel.Resources> <Ellipse x:Key="It1" Fill="Red" Width="100" Height="50"/> <Ellipse x:Key="It2" Fill="Blue" Width="200" Height="100"/> </StackPanel.Resources> <StaticResource ResourceKey="It1" /> <StaticResource ResourceKey="It2" /> </StackPanel> |
|