資源套件
資源套件提供了一種絕佳的方式,可讓您將語言分割或調整特定資產,成為依 Windows 自動下載的個別套件(視使用者的電腦設定而定),藉此減少使用者磁片使用量。 如果使用者將新的語言新增至其 區域 & 語言 設定中的作業系統語言清單,或變更顯示設定,則在自動存放區更新之間,OS 會針對裝置上所有已安裝的應用程式提取適用的資源套件。
在 Windows SDK 10.0.17095.0 AddResourcePackageAsync API可讓開發人員視需要安裝應用程式的資源套件。
如何使用 AddResourcePackageAsync API
AddResourcePackageAsync 會取得應用程式的 PackageFamilyName ,以及可唯一識別嘗試下載之資源套件的資源識別碼。 資源識別碼會對應至資源套件AppxManifest.xml中的ResourceId元素。
應用程式必須重新開機,以取得應用程式可用之所有資源的合併視圖。 API 提供可傳遞以重新開機應用程式的 ForceTargetApplicationShutdown 選項。
如果在下載資源套件時,應用程式有可用的更新,則 API 將會失敗,因為繼承應用程式無法再使用。 藉由傳入 ApplyUpdateIfAvailable 旗標,API 將會更新應用程式,並在相同的下載過程中取得要求的資源套件。
API 會傳回可顯示在應用程式中的下載進度。 另請注意,針對發佈至存放區的應用程式,資源套件取得會顯示在 [Microsoft Store下載和更新] 頁面中,並顯示為應用程式的更新。 終端使用者可以選擇暫停或取消從 Microsoft Store 下載資源套件。
範例
private async void DownloadGermanResourcePackage(object sender, RoutedEventArgs e)
{
// ResourceId that is unique to the resource package
string resourceId = "split.language-de";
// Warn user that application will need to restart.
// To take update if available pass in the ApplyUpdateIfAvailable flag
var packageCatalog = PackageCatalog.OpenForCurrentPackage();
PackageCatalogAddResourcePackageResult result = await packageCatalog.AddResourcePackageAsync("29270depappf.CaffeMacchiato_gah1vdar1nn7a", resourceId,
AddResourcePackageOptions.ApplyUpdateIfAvailable | AddResourcePackageOptions.ForceTargetApplicationShutdown)
.AsTask<PackageCatalogAddResourcePackageResult, PackageInstallProgress>(new Progress
(progress =>;
{
// Draw progress
}));
if (result.ExtendedError != null)
{
//Display error or retry if needed
}
}
驗證
針對本機驗證,開發人員可以建立 msixbundle 或 .appxbundle,然後從您的本機磁片磁碟機、網路共用或 web 伺服器進行安裝。 當應用程式呼叫 AddResourcePackageAsync API 時,Windows 會從安裝原始應用程式的位置取得資源套件。 這可簡化驗證。 這項工作完成後,就可以開始部署應用程式。
移除資源套件
應用程式可以選擇移除,以移除 (s 的資源套件,) 透過 REMOVERESOURCEPACKAGEASYNC API下載的資源套件。 不過,無法卸載適用于使用者或裝置的資源套件。
範例
private async void RemoveResourcePackage(object sender, RoutedEventArgs e)
{
var packageCatalog = PackageCatalog.OpenForCurrentPackage();
List resourcePackagesToRemove = new List();
resourcePackagesToRemove.Add("split.language-de");
//Warn user that application will be restarted
var removePackageResult = await packageCatalog.RemoveResourcePackagesAsync(resourcePackagesToRemove);
if (removePackageResult.ExtendedError != null)
{
// display error
}
}