资源包

资源包提供了一种很好的方法,通过将语言分段或将特定资产缩放为单独的包来减少用户磁盘占用量,这些包Windows用户计算机配置自动下载。 如果用户将新语言添加到区域 & 语言设置中的 OS 语言列表,或者更改显示配置,则 OS 会在整个自动存储更新中提取设备上所有已安装应用的适用资源包。

在 Windows SDK 10.0.17095.0 AddResourcePackageAsync API中,开发人员可按需为应用安装资源包。

如何使用 AddResourcePackageAsync API

  • AddResourcePackageAsync 采用 应用程序的 PackageFamilyName 和唯一标识尝试下载的资源包的资源 ID。 资源 ID 对应于资源包 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会从安装原始应用程序的位置获取资源包。 这使得验证变得简单。 此操作完成后,即可部署应用。

删除资源包

应用可以选择删除 以删除资源包 (通过 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
    }
}