资源包

资源包提供了一种将语言分段或将特定资产缩放为 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
    }
}