资源包
资源包提供了一种将语言分段或将特定资产缩放为 Windows 自动下载的单独包(具体取决于用户计算机配置)来减少用户磁盘占用情况的好方法。 如果用户在“区域和语言”设置中向其操作系统语言表添加新语言或更改显示配置,则自动存储更新时,操作系统将获取设备上所有已安装应用的适用资源包。
在 Windows SDK 10.0.17095.0 中,AddResourcePackageAsync API 允许开发人员按需安装应用的资源包。
如何使用 AddResourcePackageAsync API
AddResourcePackageAsync 采用应用程序的 PackageFamilyName 以及唯一标识尝试下载的资源包的资源 ID。 该资源 ID 对应于资源包的 AppxManifest.xml 中的 ResourceId 元素。
应用程序必须重启才能获取应用程序所有可用资源的合并视图。 API 提供 ForceTargetApplicationShutdown 选项,可以传递该选项以重启应用程序。
如果下载资源包时应用程序有可用的更新,则 API 将失败,因为旧版本的应用不再可用。 通过传入 ApplyUpdateIfAvailable 标志,API 将更新应用,并在同一下载过程中获取请求的资源包。
API 返回可在应用程序中显示的下载进度。 另请注意,对于发布到 Store 的应用,资源包获取会显示在 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 将从安装原始应用程序的位置获取资源包。 这使得验证变得简单。 一旦验证成功,便可部署应用了。
移除资源包
应用可以选择移除其通过 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
}
}
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈