Paket güncelleştirmelerini Mağaza'dan indirme ve yükleme

Windows 10, sürüm 1607'den başlayarak, Windows.Services.Store ad alanındaki StoreContext sınıfının yöntemlerini kullanarak Microsoft Store geçerli uygulama için paket güncelleştirmelerini program aracılığıyla denetleyebilir ve güncelleştirilmiş paketleri indirip yükleyebilirsiniz. Ayrıca İş Ortağı Merkezi'nde zorunlu olarak işaretlediğiniz paketleri sorgulayabilir ve zorunlu güncelleştirme yüklenene kadar uygulamanızdaki işlevselliği devre dışı bırakabilirsiniz.

Windows 10, sürüm 1803'te sunulan ek StoreContext yöntemleri, paket güncelleştirmelerini sessizce indirip yüklemenize (kullanıcıya bildirim kullanıcı arabirimi görüntülemeden), isteğe bağlı bir paketi kaldırmanıza ve uygulamanız için indirme ve yükleme kuyruğundaki paketler hakkında bilgi almanıza olanak tanır.

Bu özellikler uygulamanızın en son sürümü, isteğe bağlı paketler ve Mağaza'daki ilgili hizmetlerle kullanıcı tabanınızı otomatik olarak güncel tutmanıza yardımcı olur.

Note

API'ler Windows.Services.Store paket kimliği gerektirir ve Windows Uygulama SDK'sı ile oluşturulan WinUI 3 uygulamaları da dahil olmak üzere Microsoft Store aracılığıyla dağıtılan tüm MSIX paketli uygulamalar için çalışır. Bu makaledeki kod örnekleri ilk olarak UWP için yazılmıştır. Bunları bir WinUI 3 uygulamasına uyarlıyorsanız, this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, ...) yerine DispatcherQueue.GetForCurrentThread().TryEnqueue(...) kullanın ve MessageDialog yerine (WinUI 3'te HWND birlikte çalışabilirliği gerektiren) ContentDialog kullanın veya iletişim kutusunu pencere tanıtıcınızla ilişkilendirmek için WinRT.Interop.InitializeWithWindow.Initialize kullanın.

Kullanıcının izniyle paket güncelleştirmelerini indirme ve yükleme

Bu kod örneği, GetAppAndOptionalStorePackageUpdatesAsync yöntemini kullanarak Mağaza'dan tüm kullanılabilir paket güncelleştirmelerini bulmayı ve ardından güncelleştirmeleri indirip yüklemek için RequestDownloadAndInstallStorePackageUpdatesAsync yöntemini çağırmayı gösterir. güncelleştirmeleri indirmek ve yüklemek için bu yöntemi kullanırken işletim sistemi, güncelleştirmeleri indirmeden önce kullanıcının iznini isteyen bir iletişim kutusu görüntüler.

Note

Bu yöntemler uygulamanız için gerekli ve isteğe bağlı paketleri destekler. İsteğe bağlı paketler indirilebilir içerik (DLC) eklentileri için, büyük uygulamanızı boyut kısıtlamaları için bölmek veya çekirdek uygulamanızdan ayrı olarak ek içerik göndermek için kullanışlıdır. İsteğe bağlı paketleri (DLC eklentileri dahil) kullanan bir uygulamayı Mağaza'ya gönderme izni almak için bkz. geliştirici desteği Windows.

Bu kod örneğinde aşağıdakiler varsayılır:

  • Kod bir UWP XAML sayfası (Windows.UI.Xaml.Controls.Page) bağlamında çalışır. Bu örnekler UWP için yazılmıştır; WinUI 3 uyarlamaları için bu makalenin üst kısmındaki NOT'a bakın.
  • Sayfa, indirme işleminin durumunu sağlamak için adlı bir downloadProgressBar içerir.
  • Kod dosyasında using deyimi, Windows.Services.Store, System.Threading.Tasks ve Windows.UI.Popups ad alanları için vardır.
  • Uygulama, yalnızca uygulamayı başlatan kullanıcı bağlamında çalışan tek kullanıcılı bir uygulamadır. Çok kullanıcılı bir uygulama için GetDefault yöntemi yerine StoreContext nesnesi almak için GetForUser yöntemini kullanın.
private StoreContext context = null;

public async Task DownloadAndInstallAllUpdatesAsync()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
    }

    // Get the updates that are available.
    IReadOnlyList<StorePackageUpdate> updates =
        await context.GetAppAndOptionalStorePackageUpdatesAsync();

    if (updates.Count > 0)
    {
        // Alert the user that updates are available and ask for their consent
        // to start the updates.
        MessageDialog dialog = new MessageDialog(
            "Download and install updates now? This may cause the application to exit.", "Download and Install?");
        dialog.Commands.Add(new UICommand("Yes"));
        dialog.Commands.Add(new UICommand("No"));
        IUICommand command = await dialog.ShowAsync();

        if (command.Label.Equals("Yes", StringComparison.CurrentCultureIgnoreCase))
        {
            // Download and install the updates.
            IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> downloadOperation =
                context.RequestDownloadAndInstallStorePackageUpdatesAsync(updates);

            // The Progress async method is called one time for each step in the download
            // and installation process for each package in this request.
            downloadOperation.Progress = async (asyncInfo, progress) =>
            {
                await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
                () =>
                {
                    downloadProgressBar.Value = progress.PackageDownloadProgress;
                });
            };

            StorePackageUpdateResult result = await downloadOperation.AsTask();
        }
    }
}

Note

Kullanılabilir paket güncelleştirmelerini yalnızca indirmek (ancak yüklemek değil) için RequestDownloadStorePackageUpdatesAsync yöntemini kullanın.

İndirme ve yükleme ilerleme bilgilerini görüntüleme

RequestDownloadStorePackageUpdatesAsync veya RequestDownloadAndInstallStorePackageUpdatesAsync yöntemini çağırdığınızda, bu istekteki her paket için indirme (veya indirme ve yükleme) işlemindeki her adım için bir kez çağrılan bir İlerleme işleyicisi atayabilirsiniz. İşleyici, ilerleme bildirimini oluşturan güncelleştirme paketi hakkında bilgi sağlayan bir StorePackageUpdateStatus nesnesi alır. Önceki örnekte, indirme ve yükleme işleminin ilerleme durumunu görüntülemek için StorePackageUpdateStatus nesnesinin PackageDownloadProgress alanı kullanılır.

Tek bir işlemde paket güncelleştirmelerini indirip yüklemek için RequestDownloadAndInstallStorePackageUpdatesAsync çağrısı yaptığınızda PackageDownloadProgress alanının bir paketin indirme işlemi sırasında 0,0'dan 0,8'e yükseldiğini ve yükleme sırasında 0,8'den 1,0'a yükseldiğini unutmayın. Bu nedenle, özel ilerleme kullanıcı arabiriminizde gösterilen yüzdeyi doğrudan PackageDownloadProgress alanının değeriyle eşlerseniz, paketin indirilmesi tamamlandığında ve işletim sistemi yükleme iletişim kutusunu görüntülediğinde kullanıcı arabiriminiz 80% gösterir. Özel ilerleme kullanıcı arabiriminizin paket indirildiğinde ve yüklenmeye hazır olduğunda 100% görüntülemesini istiyorsanız, PackageDownloadProgress alanı 0,8'e ulaştığında ilerleme kullanıcı arabiriminize 100% atamak için kodunuzu değiştirebilirsiniz.

Paket güncelleştirmelerini sessizce indirme ve yükleme

Windows 10, sürüm 1803'den başlayarak, kullanıcıya bildirim kullanıcı arabirimi görüntülemeden paket güncelleştirmelerini sessizce indirip yüklemek için TrySilentDownloadStorePackageUpdatesAsync ve TrySilentDownloadAndInstallStorePackageUpdatesAsync yöntemlerini kullanabilirsiniz. Bu işlem yalnızca kullanıcı Mağaza'da Uygulamaları otomatik olarak güncelleştir ayarını etkinleştirmişse ve kullanıcı tarifeli bir ağda değilse başarılı olur. Bu yöntemleri çağırmadan önce CanSilentlyDownloadStorePackageUpdates özelliğini denetleyerek bu koşulların şu anda karşılanıp karşılanmadığını belirleyebilirsiniz.

Bu kod örneği, kullanılabilir tüm paket güncelleştirmelerini bulmak ve ardından trySilentDownloadStorePackageUpdatesAsync ve TrySilentDownloadAndInstallStorePackageUpdatesAsync yöntemlerini çağırarak güncelleştirmeleri sessizce indirip yüklemek için GetAppAndOptionalStorePackageUpdatesAsync yönteminin nasıl kullanılacağını gösterir.

Bu kod örneğinde aşağıdakiler varsayılır:

  • Kod dosyasının Windows.Services.Store ve System.Threading.Tasks ad alanları için bir using deyimi vardır.
  • Uygulama, yalnızca uygulamayı başlatan kullanıcı bağlamında çalışan tek kullanıcılı bir uygulamadır. Çok kullanıcılı bir uygulama için GetDefault yöntemi yerine StoreContext nesnesi almak için GetForUser yöntemini kullanın.

Note

Bu örnekteki kod tarafından çağrılan IsNowAGoodTimeToRestartApp, RetryDownloadAndInstallLater ve RetryInstallLater yöntemleri, kendi uygulamanızın tasarımına göre gerektiğinde uygulanması amaçlanan yer tutucu yöntemlerdir.

private StoreContext context = null;

public async Task DownloadAndInstallAllUpdatesInBackgroundAsync()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
    }

    // Get the updates that are available.
    IReadOnlyList<StorePackageUpdate> storePackageUpdates =
        await context.GetAppAndOptionalStorePackageUpdatesAsync();

    if (storePackageUpdates.Count > 0)
    {

        if (!context.CanSilentlyDownloadStorePackageUpdates)
        {
            return;
        }

        // Start the silent downloads and wait for the downloads to complete.
        StorePackageUpdateResult downloadResult =
            await context.TrySilentDownloadStorePackageUpdatesAsync(storePackageUpdates);

        switch (downloadResult.OverallState)
        {
            case StorePackageUpdateState.Completed:
                // The download has completed successfully. At this point, confirm whether your app
                // can restart now and then install the updates (for example, you might only install
                // packages silently if your app has been idle for a certain period of time). The
                // IsNowAGoodTimeToRestartApp method is not implemented in this example, you should
                // implement it as needed for your own app.
                if (IsNowAGoodTimeToRestartApp())
                {
                    await InstallUpdate(storePackageUpdates);
                }
                else
                {
                    // Retry/reschedule the installation later. The RetryInstallLater method is not  
                    // implemented in this example, you should implement it as needed for your own app.
                    RetryInstallLater();
                    return;
                }
                break;
            // If the user cancelled the download or you can't perform the download for some other
            // reason (for example, Wi-Fi might have been turned off and the device is now on
            // a metered network) try again later. The RetryDownloadAndInstallLater method is not  
            // implemented in this example, you should implement it as needed for your own app.
            case StorePackageUpdateState.Canceled:
            case StorePackageUpdateState.ErrorLowBattery:
            case StorePackageUpdateState.ErrorWiFiRecommended:
            case StorePackageUpdateState.ErrorWiFiRequired:
            case StorePackageUpdateState.OtherError:
                RetryDownloadAndInstallLater();
                return;
            default:
                break;
        }
    }
}

private async Task InstallUpdate(IReadOnlyList<StorePackageUpdate> storePackageUpdates)
{
    // Start the silent installation of the packages. Because the packages have already
    // been downloaded in the previous method, the following line of code just installs
    // the downloaded packages.
    StorePackageUpdateResult downloadResult =
        await context.TrySilentDownloadAndInstallStorePackageUpdatesAsync(storePackageUpdates);

    switch (downloadResult.OverallState)
    {
        // If the user cancelled the installation or you can't perform the installation  
        // for some other reason, try again later. The RetryInstallLater method is not  
        // implemented in this example, you should implement it as needed for your own app.
        case StorePackageUpdateState.Canceled:
        case StorePackageUpdateState.ErrorLowBattery:
        case StorePackageUpdateState.OtherError:
            RetryInstallLater();
            return;
        default:
            break;
    }
}

Zorunlu paket güncelleştirmeleri

Windows 10, sürüm 1607 veya üzerini hedefleyen bir uygulama için İş Ortağı Merkezi'nde paket gönderimi oluşturduğunuzda, paketi zorunlu ve zorunlu hale geldiği tarih ve saat olarak işaretleyebilirsiniz. Bu özellik ayarlandığında ve uygulamanız paket güncelleştirmesinin kullanılabilir olduğunu keşfettiğinde, uygulamanız güncelleştirme paketinin zorunlu olup olmadığını belirleyebilir ve güncelleştirme yüklenene kadar davranışını değiştirebilir (örneğin, uygulamanız özellikleri devre dışı bırakabilir).

Note

Paket güncelleştirmesinin zorunlu durumu Microsoft tarafından uygulanmaz ve işletim sistemi kullanıcılara zorunlu bir uygulama güncelleştirmesinin yüklenmesi gerektiğini belirten bir kullanıcı arabirimi sağlamaz. Geliştiriciler, zorunlu uygulama güncelleştirmelerini kendi kodlarında zorunlu hale getirmek için zorunlu ayarı kullanmaya yöneliktir.

Paket gönderimini zorunlu olarak işaretlemek için:

  1. İş Ortağı Merkezi'nde oturum açın ve uygulamanızın genel bakış sayfasına gidin.
  2. Zorunlu hale getirmek istediğiniz paket güncelleştirmesini içeren gönderimin adına tıklayın.
  3. Gönderim için Paketler sayfasına gidin. Bu sayfanın alt kısmındaki Bu güncelleştirmeyi zorunlu yap'ı seçin ve ardından paket güncelleştirmesinin zorunlu hale geldiği gün ve saati seçin. Bu seçenek, gönderimdeki tüm paketler için geçerlidir.

Daha fazla bilgi için bkz. Uygulama paketlerini karşıya yükleme.

Note

Bir paket uçuşu oluşturursanız, paketleri zorunlu olarak işaretlemek için, uçuşun Paketler sayfasında benzer bir kullanıcı arabirimi kullanabilirsiniz. Bu durumda zorunlu paket güncelleştirmesi yalnızca uçuş grubunun parçası olan müşteriler için geçerlidir.

Zorunlu paketler için kod örneği

Aşağıdaki kod örneği, herhangi bir güncelleştirme paketinin zorunlu olup olmadığının nasıl belirleneceğini gösterir. Genellikle, zorunlu bir paket güncellemesi başarıyla indirilemez veya yüklenemezse, kullanıcıya uygulamanın sunduğu deneyimi sorunsuz bir şekilde sınırlandırmanız gerekir.

private StoreContext context = null;

// Downloads and installs package updates in separate steps.
public async Task DownloadAndInstallAllUpdatesAsync()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
    }  

    // Get the updates that are available.
    IReadOnlyList<StorePackageUpdate> updates =
        await context.GetAppAndOptionalStorePackageUpdatesAsync();

    if (updates.Count != 0)
    {
        // Download the packages.
        bool downloaded = await DownloadPackageUpdatesAsync(updates);

        if (downloaded)
        {
            // Install the packages.
            await InstallPackageUpdatesAsync(updates);
        }
    }
}

// Helper method for downloading package updates.
private async Task<bool> DownloadPackageUpdatesAsync(IEnumerable<StorePackageUpdate> updates)
{
    bool downloadedSuccessfully = false;

    IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> downloadOperation =
        this.context.RequestDownloadStorePackageUpdatesAsync(updates);

    // The Progress async method is called one time for each step in the download process for each
    // package in this request.
    downloadOperation.Progress = async (asyncInfo, progress) =>
    {
        await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
        () =>
        {
            downloadProgressBar.Value = progress.PackageDownloadProgress;
        });
    };

    StorePackageUpdateResult result = await downloadOperation.AsTask();

    switch (result.OverallState)
    {
        case StorePackageUpdateState.Completed:
            downloadedSuccessfully = true;
            break;
        default:
            // Get the failed updates.
            var failedUpdates = result.StorePackageUpdateStatuses.Where(
                status => status.PackageUpdateState != StorePackageUpdateState.Completed);

            // See if any failed updates were mandatory
            if (updates.Any(u => u.Mandatory && failedUpdates.Any(
                failed => failed.PackageFamilyName == u.Package.Id.FamilyName)))
            {
                // At least one of the updates is mandatory. Perform whatever actions you
                // want to take for your app: for example, notify the user and disable
                // features in your app.
                HandleMandatoryPackageError();
            }
            break;
    }

    return downloadedSuccessfully;
}

// Helper method for installing package updates.
private async Task InstallPackageUpdatesAsync(IEnumerable<StorePackageUpdate> updates)
{
    IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> installOperation =
        this.context.RequestDownloadAndInstallStorePackageUpdatesAsync(updates);

    // The package updates were already downloaded separately, so this method skips the download
    // operation and only installs the updates; no download progress notifications are provided.
    StorePackageUpdateResult result = await installOperation.AsTask();

    switch (result.OverallState)
    {
        case StorePackageUpdateState.Completed:
            break;
        default:
            // Get the failed updates.
            var failedUpdates = result.StorePackageUpdateStatuses.Where(
                status => status.PackageUpdateState != StorePackageUpdateState.Completed);

            // See if any failed updates were mandatory
            if (updates.Any(u => u.Mandatory && failedUpdates.Any(failed => failed.PackageFamilyName == u.Package.Id.FamilyName)))
            {
                // At least one of the updates is mandatory, so tell the user.
                HandleMandatoryPackageError();
            }
            break;
    }
}

// Helper method for handling the scenario where a mandatory package update fails to
// download or install. Add code to this method to perform whatever actions you want
// to take, such as notifying the user and disabling features in your app.
private void HandleMandatoryPackageError()
{
}

İsteğe bağlı paketleri kaldırma

Windows 10, sürüm 1803'den başlayarak, geçerli uygulama için isteğe bağlı bir paketi (DLC paketi dahil) kaldırmak için RequestUninstallStorePackageAsync veya RequestUninstallStorePackageByStoreIdAsync yöntemlerini kullanabilirsiniz. Örneğin, isteğe bağlı paketler aracılığıyla yüklenen içeriğe sahip bir uygulamanız varsa, kullanıcıların diskte yer açmak için isteğe bağlı paketleri kaldırmasına olanak tanıyan bir kullanıcı arabirimi sağlamak isteyebilirsiniz.

Aşağıdaki kod örneğinde RequestUninstallStorePackageAsync'in nasıl çağrılması gösterilmektedir. Bu örnekte aşağıdakiler varsayılır:

  • Kod dosyasının Windows.Services.Store ve System.Threading.Tasks ad alanları için bir using deyimi vardır.
  • Uygulama, yalnızca uygulamayı başlatan kullanıcı bağlamında çalışan tek kullanıcılı bir uygulamadır. Çok kullanıcılı bir uygulama için GetDefault yöntemi yerine StoreContext nesnesi almak için GetForUser yöntemini kullanın.
public async Task UninstallPackage(Windows.ApplicationModel.Package package)
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
    }

    IAsyncOperation<StoreUninstallStorePackageResult> uninstallOperation =
        context.RequestUninstallStorePackageAsync(package);

    // At this point, you can update your app UI to show that the package
    // is installing.

    uninstallOperation.Completed += (asyncInfo, status) =>
    {
        StoreUninstallStorePackageResult result = uninstallOperation.GetResults();
        switch (result.Status)
        {
            case StoreUninstallStorePackageStatus.Succeeded:
                {
                    // Update your app UI to show the package as uninstalled.
                    break;
                }
            default:
                {
                    // Update your app UI to show that the package uninstall failed.
                    break;
                }
        }
    };
}

İndirme kuyruğu bilgilerini alma

Windows 10, sürüm 1803'ten başlayarak, Mağaza'dan geçerli indirme ve yükleme kuyruğundaki paketler hakkında bilgi almak için GetAssociatedStoreQueueItemsAsync ve GetStoreQueueItemsAsync yöntemlerini kullanabilirsiniz. Uygulamanız veya oyununuz indirilmesi ve yüklenmesi saatler veya günler sürebilen büyük isteğe bağlı paketleri (DC'ler dahil) destekliyorsa ve indirme ve yükleme işlemi tamamlanmadan önce bir müşterinin uygulamanızı veya oyununuzu kapatması durumunu düzgün bir şekilde işlemek istiyorsanız bu yöntemler kullanışlıdır. Müşteri uygulamanızı veya oyununuzu yeniden başlattığında kodunuz, her paketin durumunu müşteriye görüntüleyebilmeniz için indirme ve yükleme kuyruğundaki paketlerin durumu hakkında bilgi almak için bu yöntemleri kullanabilir.

Aşağıdaki kod örneğinde, geçerli uygulamanın devam eden paket güncelleştirmelerinin listesini almak ve her paket için durum bilgilerini almak için GetAssociatedStoreQueueItemsAsync'in nasıl çağrılması gösterilmektedir. Bu örnekte aşağıdakiler varsayılır:

  • Kod dosyasının Windows.Services.Store ve System.Threading.Tasks ad alanları için bir using deyimi vardır.
  • Uygulama, yalnızca uygulamayı başlatan kullanıcı bağlamında çalışan tek kullanıcılı bir uygulamadır. Çok kullanıcılı bir uygulama için GetDefault yöntemi yerine StoreContext nesnesi almak için GetForUser yöntemini kullanın.

Note

Bu örnekte kod tarafından çağrılan MarkUpdateInProgressInUI, RemoveItemFromUI, MarkInstallCompleteInUI, MarkInstallErrorInUI ve MarkInstallPausedInUI yöntemleri, kendi uygulamanızın tasarımına göre gerektiğinde uygulanması amaçlanan yer tutucu yöntemlerdir.

private StoreContext context = null;

private async Task GetQueuedInstallItemsAndBuildInitialStoreUI()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
    }

    // Get the Store packages in the install queue.
    IReadOnlyList<StoreQueueItem> storeUpdateItems = await context.GetAssociatedStoreQueueItemsAsync();

    foreach (StoreQueueItem storeItem in storeUpdateItems)
    {
        // In this example we only care about package updates.
        if (storeItem.InstallKind != StoreQueueItemKind.Update)
            continue;

        StoreQueueItemStatus currentStatus = storeItem.GetCurrentStatus();
        StoreQueueItemState installState = currentStatus.PackageInstallState;
        StoreQueueItemExtendedState extendedInstallState =
            currentStatus.PackageInstallExtendedState;

        // Handle the StatusChanged event to display current status to the customer.
        storeItem.StatusChanged += StoreItem_StatusChanged;

        switch (installState)
        {
            // Download and install are still in progress, so update the status for this  
            // item and provide the extended state info. The following methods are not
            // implemented in this example; you should implement them as needed for your
            // app's UI.
            case StoreQueueItemState.Active:
                MarkUpdateInProgressInUI(storeItem, extendedInstallState);
                break;
            case StoreQueueItemState.Canceled:
                RemoveItemFromUI(storeItem);
                break;
            case StoreQueueItemState.Completed:
                MarkInstallCompleteInUI(storeItem);
                break;
            case StoreQueueItemState.Error:
                MarkInstallErrorInUI(storeItem);
                break;
            case StoreQueueItemState.Paused:
                MarkInstallPausedInUI(storeItem, installState, extendedInstallState);
                break;
        }
    }
}

private void StoreItem_StatusChanged(StoreQueueItem sender, object args)
{
    StoreQueueItemStatus currentStatus = sender.GetCurrentStatus();
    StoreQueueItemState installState = currentStatus.PackageInstallState;
    StoreQueueItemExtendedState extendedInstallState = currentStatus.PackageInstallExtendedState;

    switch (installState)
    {
        // Download and install are still in progress, so update the status for this  
        // item and provide the extended state info. The following methods are not
        // implemented in this example; you should implement them as needed for your
        // app's UI.
        case StoreQueueItemState.Active:
            MarkUpdateInProgressInUI(sender, extendedInstallState);
            break;
        case StoreQueueItemState.Canceled:
            RemoveItemFromUI(sender);
            break;
        case StoreQueueItemState.Completed:
            MarkInstallCompleteInUI(sender);
            break;
        case StoreQueueItemState.Error:
            MarkInstallErrorInUI(sender);
            break;
        case StoreQueueItemState.Paused:
            MarkInstallPausedInUI(sender, installState, extendedInstallState);
            break;
    }
}