Implémenter le FileSavePicker/FileOpenPicker dans une application Windows Phone 8.1 Silverlight

Le FileSavePicker est l’une des nouveautés du SDK Windows Phone 8.1. Il nous permet par exemple d’implémenter la fonctionnalité « enregistrer sous… ». Nous étions jusqu’à présent limité à la sauvegarde dans la « pellicule »  ou « les photos enregistrées ».

En effet, on peut maintenant donner la possibilité à l’utilisateur de choisir l’emplacement de sauvegarde d’un fichier.

Si vous avez essayé d’implémenter cette fonctionnalité, vous êtes sans doute tombé sur l’article MSDN qui traite le sujet mais malheureusement, il cible les Universal Apps.

Il existe pourtant bien un article sur MSDN qui traite du FileOpenPicker pour une application Windows Phone 8.1 Silverlight, mais il est bien caché :

Continue your Windows Phone Silverlight 8.1 app after calling a file picker

Bref, voici mon implémentation du FileSavePicker pour WP8.1 Silverlight:

Dans le fichier app.xaml.cs, ajouter les lignes suivantes (event args + abonnement à l’évent)

public FileSavePickerContinuationEventArgs FilePickerContinuationArgs { get; set; }

Dans la méthode InitializePhoneApplication(), s’abonner à l’évènement ContractActivated:

PhoneApplicationService.Current.ContractActivated += Application_ContractActivated;

Créer le délégué:

// Code to execute when the application is activated
// This code will not execute when the application is first launched
private void Application_ContractActivated(object sender, IActivatedEventArgs e)
{
  var filePickerContinuationArgs = e as FileSavePickerContinuationEventArgs;
  if (filePickerContinuationArgs != null)
       this.FilePickerContinuationArgs = filePickerContinuationArgs;
}

Maintenant, l’application est prête à utiliser le FilePicker.

Dans les pages où l’on souhaite utiliser le FilePicker, il ne reste plus qu’à déclencher le FileSavePicker et à vérifier le contenu de l’argument FilePickerContinuationArgs (déclaré dans l’App) pour savoir si l’application s’affiche suite à l’ouverture d’un FilePicker:

Dans le OnNavigatedTo :

protected override void OnNavigatedTo(NavigationEventArgs e)
{
   var app = App.Current as App;
   if (app.FilePickerContinuationArgs != null)
         this.ContinueFileSavePicker(app.FilePickerContinuationArgs);
}

Créer le délégué async:

public async void ContinueFileSavePicker(FileSavePickerContinuationEventArgs args)
{
    if ((args.ContinuationData["Operation"] as string) == "SaveMyPicAs" &&  args.File != null)
    {
         StorageFile file = args.File;

         if (file.Name.EndsWith("jpg"))
         {
            // Save my content into the selected file
            // Prevent updates to the remote version of the file until we finish making changes and call CompleteUpdatesAsync.
            CachedFileManager.DeferUpdates(file);

           // MyBorder is the xaml Border control I want to render
           var bmpCurrentScreenImage = new WriteableBitmap((int)MyBorder.ActualWidth, (int)MyBorder.ActualHeight);
           bmpCurrentScreenImage.Render(MyBorder, new MatrixTransform());
           bmpCurrentScreenImage.Invalidate();

           // write to file
           await FileIO.WriteBytesAsync(file, bmpCurrentScreenImage.ToByteArray());

           // Let Windows know that we're finished changing the file so the other app can update the remote version of the file.
           // Completing updates may require Windows to ask for user input.
           FileUpdateStatus status = await CachedFileManager.CompleteUpdatesAsync(file);

           // You can use my nuget package called "Toastinet" to display toast
           if (status == FileUpdateStatus.Complete)
              MyToast.Message = "File saved";
           else
              MyToast.Message = "Unable to save file";
        }
    }
}

La dernière étape consiste à déclencher le FileSavePicker, lors d’un clique utilisateur par exemple:

private void OnSaveAs(object sender, EventArgs e)
{
    var savePicker = new FileSavePicker
    {
       SuggestedStartLocation = PickerLocationId.PicturesLibrary,
       SuggestedFileName = "4shot_polaroid"
    }; 

    // Dropdown of file types the user can save the file as savePicker.
    FileTypeChoices.Add("JPEG", new List<string> { ".jpg", ".jpeg" });
    savePicker.ContinuationData["Operation"] = "SaveMyPicAs";
    savePicker.PickSaveFileAndContinue();
}

Voilà, j’espère que ça en aidera certains.

Je remercie Toss.Net de m’avoir aidé à trouver l’article dans le MSDN.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s