Comment effectuer des appels asynchrones dans votre gestionnaire DataRequested
Langage: HTML | XAML

Comment effectuer des appels asynchrones dans votre gestionnaire DataRequested (XAML)

[ Cet article est destiné aux développeurs de Windows 8.x et Windows Phone 8.x qui créent des applications Windows Runtime. Si vous développez une application pour Windows 10, voir la Documentation ]

Nous allons vous montrer comment produire des données de manière asynchrone en réponse à un événement DataRequested. Si votre application effectue des opérations asynchrones en réponse à un événement DataRequested, elle doit d’abord acquérir un objet DataRequestDeferral. Acquérir un report permet au système de savoir que votre appel à SetData peut se produire après le retour du délégué.

Remarque  Si vous partagez uniquement du texte ou un lien, vous pouvez ignorer le code fourni dans cette rubrique. Il est plus rapide d’utiliser les méthodes SetText et SetUri .
 

Ce que vous devez savoir

Technologies

Prérequis

Instructions

Étape 1: Ajout de l’espace de noms DataTransfer

Tout d’abord, vous devez ajouter les espaces de noms appropriés à votre application afin de pouvoir créer et traiter les objets associés au partage. Vous devez ajouter au minimum l’espace de noms Windows.ApplicationModel.DataTransfer :


using Windows.ApplicationModel.DataTransfer;


Cet espace de noms comporte tous les éléments nécessaires pour le partage de base. Gardez cependant à l’esprit que, si vous voulez partager un contenu tel que des images ou fichiers, vous devez également ajouter ces espaces de noms. Voici une liste des espaces de noms dont vous pouvez avoir besoin :

Étape 2: Obtenir l’objet DataTransferManager

L’objet DataTransferManager est le point de départ principal de toute opération de partage.


DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();


Étape 3: ajouter un gestionnaire d’événements pour l’événement DataRequested

Ajoutez un gestionnaire d’événements DataRequested qui se déclenche quand l’utilisateur souhaite appeler le partage. Dans une application du Windows Store, cela se produit automatiquement quand l’utilisateur appelle l’icône Partager. Si vous développez une application pour Windows Phone, aucune icône Partager n’est intégrée, donc vous devez ajouter un contrôle sur lequel l’utilisateur peut appuyer pour déclencher le gestionnaire.


dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(this.DataRequested);


Étape 4: obtenir un objet DataRequest

Lorsqu’un événement DataRequested survient, votre application reçoit un objet DataRequest. Cet objet contient une classe DataPackage que vous pouvez utiliser pour fournir le contenu qu’un utilisateur souhaite partager.


DataRequest request = e.Request;


Étape 5: Obtenir un objet DataRequestDeferral, si nécessaire

Vous devrez obtenir un objet DataRequestDeferral si votre application appelle toute méthode asynchrone après qu’elle a reçu l’objet DataRequest. Pour obtenir un objet de report, appelez la méthode GetDeferral.


DataRequestDeferral deferral = e.Request.GetDeferral();


Étape 6: Ajouter les données au DataPackage

Pour ajouter du contenu, vous pouvez utiliser n’importe quelle méthode prise en charge par la classe DataPackage. Nous utilisons ici SetBitmap pour ajouter une image modifiée en tant que RandomAccessStream.


e.Request.Data.SetBitmap(imageStreamRef);


Étape 7: Appeler la méthode complète, si nécessaire

Si vous avez récupéré un objet DataRequestDeferral à l’étape 5, vous devez appeler la méthode DataRequestDeferral.Complete afin que le système prenne connaissance des données qui sont prêtes au partage.


deferral.Complete();


Remarque  Vous devez également appeler DataRequestDeferral.Complete dans le gestionnaire d’erreurs de l’appel asynchrone.
 

Remarques

Pour télécharger le code qui illustre comment retarder le partage, voir l’exemple de notre bibliothèque de code.

Exemple


protected override void OnNavigatedTo(NavigationEventArgs e)
{
    // Register this page as a share source.
    this.dataTransferManager = DataTransferManager.GetForCurrentView();
    this.dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, 
            DataRequestedEventArgs>(this.OnDataRequested);
}

private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs e)
{
    if (imageFile != null)
    {
        DataPackage requestData = e.Request.Data;
        requestData.Properties.Title = "Delay rendered image";
        requestData.Properties.Description = "Resized image from the Share Source sample";
        requestData.Properties.Thumbnail = RandomAccessStreamReference.CreateFromFile(imageFile);
        requestData.SetDataProvider(StandardDataFormats.Bitmap, 
                new DataProviderHandler(this.OnDeferredImageRequestedHandler));
    }
    else
    {
    e.Request.FailWithDisplayText("Select an image you would like to share and try again.");
    }
}

private async void OnDeferredImageRequestedHandler(DataProviderRequest request)
{
    // In this delegate we provide updated Bitmap data using delayed rendering.

    if (this.imageFile != null)
    {
        // If the delegate is calling any asynchronous operations it needs to acquire
        // the deferral first. This lets the system know that you are performing some
        // operations that might take a little longer and that the call to SetData 
        // could happen after the delegate returns. Once you acquired the deferral object 
        // you must call Complete on it after your final call to SetData.
        DataProviderDeferral deferral = request.GetDeferral();
        InMemoryRandomAccessStream inMemoryStream = new InMemoryRandomAccessStream();

        // Make sure to always call Complete when finished with the deferral.
        try
        {
            // Decode the image and re-encode it at 50% width and height.
            IRandomAccessStream imageStream = await this.imageFile.OpenAsync(FileAccessMode.Read);
            BitmapDecoder imageDecoder = await BitmapDecoder.CreateAsync(imageStream);
            BitmapEncoder imageEncoder = await BitmapEncoder.CreateForTranscodingAsync(inMemoryStream, 
                    imageDecoder);
            imageEncoder.BitmapTransform.ScaledWidth = (uint)(imageDecoder.OrientedPixelWidth * 0.5);
            imageEncoder.BitmapTransform.ScaledHeight = (uint)(imageDecoder.OrientedPixelHeight * 0.5);
            await imageEncoder.FlushAsync();

            request.SetData(RandomAccessStreamReference.CreateFromStream(inMemoryStream));
        }
        finally
        {
            deferral.Complete();
        }
    }
}

Rubriques associées

Exemple de partage de contenu source entre applications
Partage et échange de données
Comment prendre en charge les opérations Pull
Démarrage rapide : partage de contenu
DataPackage
Windows.ApplicationModel.DataTransfer
Windows.ApplicationModel.DataTransfer.Share
Scénarios de fonctionnalités de l’exemple Reversi : partage de contenu

 

 

Afficher:
© 2016 Microsoft