Comment partager une image (applications Windows Runtime en C#/VB/C++ et XAML)
Les images et les photos sont probablement les types de contenu que les utilisateurs partagent le plus. Nous allons vous montrer comment partager une image à partir de votre application.
Le code de cette section s’attache à l’utilisation de la méthode SetBitmap pour partager une image bitmap. Souvent, les utilisateurs partagent des images qui sont représentées sous forme de fichiers. C’est pourquoi nous recommandons que votre application prenne également en charge StorageItems, qui est une collection de fichiers. Nous décrivons comment prendre en charge StorageItems dans Comment partager des fichiers.
Ce que vous devez savoir
Technologies
Prérequis
- Vous devez être familiarisé avec Visual Studio et ses modèles.
- Vous devez être familiarisé avec le développement en C#/C++.
- Vous devez comprendre comment obtenir des fichiers et d’autres données à l’aide de l’objet FileOpenPicker, par exemple. Pour en savoir plus, voir Démarrage rapide : Accès aux fichiers à l’aide de sélecteurs de fichiers.
Instructions
Étape 1: Ajout de l’espace de noms DataTransfer
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;
using namespace 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 :
- Windows.Storage. Nécessaire pour l’utilisation de StorageFile et d’autres objets.
- Windows.Storage.Pickers. Permet d’ouvrir le sélecteur de fichiers afin que les utilisateurs puissent sélectionner des images et fichiers.
- Windows.Storage.Streams. Souvent utilisé lors du partage d’images, de fichiers et de données de format personnalisé.
- Windows.Graphics.Imaging. Utile si vous devez modifier des images avant de les partager.
Étape 2: Obtenir l’objet DataTransferManager
L’objet DataTransferManager est le point de départ de toute opération de partage.
DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
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.ShareImageHandler);
auto dataRequestedToken = dataTransferManager->DataRequested +=
ref new TypedEventHandler<DataTransferManager^, DataRequestedEventArgs^>(
this, &MainPage:: ShareImageHandler);
É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;
DataRequest^ request = e->Request;
Étape 5: Définir les propriétés de titre et de description
La propriété title est obligatoire et doit être définie.
// The title is mandatory
request.Data.Properties.Title = "Share Image Example";
request.Data.Properties.Description = "Demonstrates how to share an image.";
// The title is mandatory
request->Data->Properties->Title = "Share Image Example";
request->Data->Properties->Description = "Demonstrates how to share an image.";
Étape 6: Ajouter une miniature au DataPackage
Nous vous recommandons d’associer systématiquement une image miniature à une image partagée.
request.Data.Properties.Thumbnail = RandomAccessStreamReference.CreateFromFile(thumbnailFile);
request->Data->Properties->Thumbnail = RandomAccessStreamReference::CreateFromFile(thumbnailFile);
Pour plus d’informations sur les tailles de fichier recommandées pour les images miniatures, voir la rubrique de référence Thumbnail.
Étape 7: ajouter l’image en tant que bitmap au DataPackage
Pour partager une image, utilisez la méthode SetBitmap. Cette méthode attend une image de type RandomAccessStreamReference. Pour partager plusieurs images, partagez-les plutôt au format StorageItems. Nous décrivons comment prendre en charge StorageItems dans Comment partager des fichiers. Ainsi, vous vous assurez que les utilisateurs auront accès au plus grand choix d’applications pour partager une image.
request.Data.SetBitmap(RandomAccessStreamReference.CreateFromFile(imageFile));
request->Data->SetBitmap(RandomAccessStreamReference::CreateFromFile(imageFile));
Remarques
Si votre application doit utiliser une opération asynchrone pour préparer l’image ou la miniature, vous devrez utiliser le schéma de report. Nous montrons comment procéder dans Comment effectuer des appels asynchrones dans votre gestionnaire DataRequested.
Si votre application met plus de 200 millisecondes à préparer l’image, vous devez utiliser une fonction déléguée pour la partager. La procédure à suivre pour cela est décrite dans la section Comment prendre en charge les opérations Pull.
Exemple
Voici un exemple qui définit une image qu’un utilisateur souhaite partager. Pour obtenir un exemple plus complet, voir l’exemple de notre bibliothèque de code.
private void RegisterForShare()
{
DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager,
DataRequestedEventArgs>(this.ShareImageHandler);
}
private async void ShareImageHandler(DataTransferManager sender,
DataRequestedEventArgs e)
{
DataRequest request = e.Request;
request.Data.Properties.Title = "Share Image Example";
request.Data.Properties.Description = "Demonstrates how to share an image.";
// Because we are making async calls in the DataRequested event handler,
// we need to get the deferral first.
DataRequestDeferral deferral = request.GetDeferral();
// Make sure we always call Complete on the deferral.
try
{
StorageFile thumbnailFile =
await Package.Current.InstalledLocation.GetFileAsync("Assets\\SmallLogo.png");
request.Data.Properties.Thumbnail =
RandomAccessStreamReference.CreateFromFile(thumbnailFile);
StorageFile imageFile =
await Package.Current.InstalledLocation.GetFileAsync("Assets\\Logo.png");
request.Data.SetBitmap(RandomAccessStreamReference.CreateFromFile(imageFile));
}
finally
{
deferral.Complete();
}
}
void MainPage::RegisterForShare()
{
DataTransferManager^ dataTransferManager = DataTransferManager::GetForCurrentView();
auto dataRequestedToken = dataTransferManager->DataRequested +=
ref new TypedEventHandler<DataTransferManager^, DataRequestedEventArgs^>(
this, &MainPage::ShareImageHandler);
}
void MainPage::ShareImageHandler(DataTransferManager^ sender, DataRequestedEventArgs^ e)
{
DataRequest^ request = e->Request;
request->Data->Properties->Title = "Share Image Example";
request->Data->Properties->Description = "Demonstrates how to share an image.";
// Because we are making async calls in the DataRequested event handler,
// we need to get the deferral first.
DataRequestDeferral^ deferral = request->GetDeferral();
create_task(Package::Current->InstalledLocation->GetFileAsync("Assets\\SmallLogo.png")).then(
[this, request](StorageFile^ thumbnailFile)
{
request->Data->Properties->Thumbnail =
RandomAccessStreamReference::CreateFromFile(thumbnailFile);
return Package::Current->InstalledLocation->GetFileAsync("Assets\\Logo.png");
}).then([this, request, deferral](task<StorageFile^> getImageFileTask)
{
try
{
auto imageFile = getImageFileTask.get();
request->Data->SetBitmap(RandomAccessStreamReference::CreateFromFile(imageFile));
deferral->Complete();
}
catch (Exception^ ex)
{
// Calling FailWithDisplayText() also calls Complete the deferral.
request->FailWithDisplayText(ex->Message);
}
});
Rubriques associées
Exemple de partage de contenu source entre applications
Comment partager du contenu HTML
Démarrage rapide : partage de contenu
Windows.ApplicationModel.DataTransfer
Windows.ApplicationModel.DataTransfer.Share
Scénarios de fonctionnalités de l’exemple Reversi : partage de contenu