資源管理系統
資源管理系統同時具有建置階段和執行階段功能。 在組建階段,系統會針對封裝在應用程式中的資源,建立所有不同變數的索引。 此索引是封裝資源索引,亦即 PRI,它會一起納入應用程式的套件中。 在執行階段時,系統會偵測有效的使用者和機器設定,查閱 PRI 中的資訊,並自動載入與這些設定最相符的資源。
封裝資源索引 (PRI) 檔案
每個應用程式套件在應用程式中都應包含資源的二進位索引。 此索引是在建置階段建立的,並且包含在一個或多個套件資源索引 (PRI) 檔案中。
- PRI 檔案包含實際的字串資源,以及參考封裝中各種檔案的索引檔案路徑集。
- 套件通常包含個別語言的單一 PRI 檔案,名稱為 resources.pri。
- 位在每個套件根目錄的 resources.pri 檔案會在 ResourceManager 具現化時載入。
- 可以使用工具 MakePRI.exe 建立和傾印 PRI 檔案。
- 針對一般應用程式開發,您不需要 MakePRI.exe,因為它已經整合到 Visual Studio 編譯工作流程中。 Visual Studio 支援在專用 UI 中編輯 PRI 檔案。 不過,您的當地語系化人員和他們所使用的工具可能會依賴 MakePRI.exe。
- 每個 PRI 檔案都包含已命名的資源集合,可當作資源地圖來參照。 當載入套件中的 PRI 檔案時,將驗證資源地圖名稱是否與套件識別名稱相符。
- PRI 檔案僅含資料,因此不採用可攜式執行檔 (PE) 格式。 它們專門設計為僅做為 Windows 資源格式的資料。 它們會取代 Win32 應用程式模型中 DLL 中包含的資源。
UWP API 對應用程式資源的存取
基本功能 (ResourceLoader)
以程式設計方式存取應用程式資源的最簡單方法是使用 Windows.ApplicationModel.Resources 命名空間和 ResourceLoader 類別。 ResourceLoader 提供基本的存取權,可讓您從資源檔案集、參照程式庫或其他套件存取字串資源。
進階功能 (ResourceManager)
ResourceManager 類別 (位於 Windows.ApplicationModel.Resources.Core 命名空間中) 提供有關資源的附加資訊,例如列舉和檢查。 這些功能是 ResourceLoader 類別所不能提供的。
NamedResource 物件表示具有多種語言或其他限定變體的單一邏輯資源。 它會描述資產或資源的邏輯視圖,具有字串資源識別碼 (例如 Header1
)或資源檔案名稱 (例如 logo.jpg
)。
ResourceCandidate 物件表示單一特定資源值及其限定詞,例如英文字串「Hello World」,或做為特定於 scale-100 解析度的限定圖片資源的「logo.scale-100.jpg」。
應用程式的資源存放在階層化的集合中,可透過 ResourceMap 物件存取。 ResourceManager 針對應用程式使用的各種高階層 ResourceMap 執行個體提供存取權,它們可對應應用程式的各種套件。 MainResourceMap 值可對應目前應用程式套件的資源地圖,且排除任何參照架構套件。 每個 ResourceMap 都是按照套件資訊清單中指定的套件名稱來命名。 ResourceMap 中有樹狀子目錄 (請參閱 ResourceMap.GetSubtree),其中進一步包含 NamedResource 物件。 樹狀子目錄通常對應含有資源的資源檔案。 有關詳細資訊,請參閱當地語系化您的 UI 及應用程式套件資訊清單中的字串,以及載入針對縮放比例、佈景主題、高對比及其他設定量身打造的影像和資產。
以下是範例。
// using Windows.ApplicationModel.Resources.Core;
ResourceMap resourceMap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
ResourceContext resourceContext = ResourceContext.GetForCurrentView()
var str = resourceMap.GetValue("String1", resourceContext).ValueAsString;
注意:資源識別碼會被視為統一資源識別碼 (URI) 片段,受限於 URI 語意。 例如,GetValue("Caption%20")
會被視為 GetValue("Caption ")
。 請勿在資源識別碼中使用「?」或「#」,因為它們會終止資源路徑評估。 例如,「MyResource?3」會被視為「MyResource」。
ResourceManager 不僅支援存取應用程式的字串資源,也會維護列舉與檢查各種檔案資源的功能。 為了避免檔案和從檔案中衍生的其他資源發生衝突,已加入索引的檔案路經全都會位於預留的「檔案」ResourceMap 樹狀子目錄中。 例如,檔案 \Images\logo.png
會對應資源名稱 Files/images/logo.png
。
StorageFile 會透明地處理做為資源的檔案的參考,並且適用於典型的使用案例。 ResourceManager 應該只用於進階案例,例如當您想要覆寫目前內容時。
ResourceContext
系統在選擇資源時的依據是特定 ResourceContext,它是資源限定詞的值集合 (語言、比例、對比等)。 除非遭到覆寫,否則預設脈絡會使用應用程式目前針對個別限定詞值的設定。 舉例來說,影像這類資源可能受到比例的限定,而比例會因監視器而異,因此也會因應用程式檢視而異。 基於此,每個應用程式檢視都有不同的預設脈絡。 可以使用 ResourceContext.GetForCurrentView 取得指定檢視的預設內容。 一旦您擷取了資源選項,就必須以 ResourceContext 執行個體來傳遞,以便取得最適合特定檢視的值。