Ressourcenpakete

Ressourcenpakete sind eine gute Möglichkeit zum Verringern des Speicherbedarfs der Benutzer auf Datenträgern, weil sich für Sprachen oder Skalierung spezifische Ressourcen in separate Pakete segmentieren lassen, die von Windows je nach Computerkonfiguration des Benutzers automatisch heruntergeladen werden. Wenn der Benutzer in den Einstellungen für Region und Sprache eine neue Sprache zur Liste der Betriebssystemsprachen hinzufügt oder über ein automatisches Store-Update die Anzeigekonfiguration ändert, ruft das Betriebssystem anwendbare Ressourcenpakete für alle auf dem Gerät installierten Apps ab.

In der AddResourcePackageAsync-API von Windows SDK 10.0.17095.0 können Entwickler ein Ressourcenpaket für eine App nach Bedarf installieren.

Anleitung zum Verwenden der AddResourcePackageAsync-API

  • AddResourcePackageAsync verwendet den PackageFamilyName der Anwendung und die Ressourcen-ID, die das herunterzuladende Ressourcenpaket eindeutig identifiziert. Die Ressourcen-ID entspricht dem Element ResourceId in der AppxManifest.xml des Ressourcenpakets.

  • Die Anwendung muss neu gestartet werden, um eine zusammengeführte Ansicht aller für die Anwendung verfügbaren Ressourcen zu erhalten. Die API verfügt über die Option ForceTargetApplicationShutdown, die für einen Neustart der Anwendung übergeben werden kann.

  • Wenn beim Herunterladen des Ressourcenpakets ein Update für die Anwendung verfügbar ist, schlägt die API fehl, da die ältere Version der App nicht mehr zur Verfügung steht. Durch Übergeben des Flags ApplyUpdateIfAvailable aktualisiert die API die App und ruft im Rahmen desselben Downloads auch das angeforderte Ressourcenpaket ab.

  • Die API gibt einen Fortschritt für den Download zurück, der in der Anwendung angezeigt werden kann. Beachten Sie außerdem, dass für die im Store veröffentlichten Apps der Ressourcenpaketerwerb im Microsoft Store auf der Seite Downloads und Updates erscheint und als Update für Ihre Anwendung angezeigt wird. Der Endbenutzer kann den Download des Ressourcenpakets aus dem Microsoft Store anhalten oder abbrechen.

Beispiel

 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
        }
}

Überprüfen

Für die lokale Validierung können Entwickler eine .msixbundle oder .appxbundle-Datei erstellen und über Ihr lokales Laufwerk, die Netzwerkfreigabe oder den Webserver installieren. Wenn die App die AddResourcePackageAsync-API aufruft, übernimmt Windows das Ressourcenpaket vom Speicherort, an dem die ursprüngliche Anwendung installiert wurde. Das macht die Validierung ganz einfach. Sobald alles funktioniert, kann die App bereitgestellt werden.

Entfernen von Ressourcenpaketen

Die App kann das (die) heruntergeladene(n) Ressourcenpaket(e) über die RemoveResourcePackageAsync-API wieder entfernen. Ressourcenpakete, die für den Benutzer oder das Gerät insgesamt anwendbar sind, können jedoch nicht deinstalliert werden.

Beispiel

 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
    }
}