Condividere dati
Questo articolo illustra come supportare il contratto di condivisione in un'app desktop o UWP (Universal Windows Platform). Il contratto Condividi è un modo semplice per condividere rapidamente dati, come testo, link, foto e video, tra le app. Ad esempio, un utente può condividere una pagina Web con gli amici mediante un'app di social networking o salvare un link in un'app di appunti per tornarvi in seguito.
Nota
Gli esempi di codice in questo articolo provengono dalle app UWP. Le app desktop devono usare IDataTransferManagerInterop.. Per altre informazioni ed esempi di codice, vedere Visualizzazione di oggetti WinRT Ui che dipendono da CoreWindow. Also see the di app per l'originecdel contenuto di condivisione WPF .
Aggiungere un gestore eventi DataRequested da chiamare ogni volta che un utente richiama la condivisione. Ciò può verificarsi quando l'utente tocca un controllo nella tua app (ad esempio un pulsante o un comando della barra dell'app) o automaticamente in uno scenario specifico (se l'utente termina un livello e ottiene un punteggio elevato, ad esempio).
DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
dataTransferManager.DataRequested += DataTransferManager_DataRequested;
Quando si verifica un evento DataRequested, l'app riceve un oggetto DataRequest. Contiene un DataPackage che è possibile usare per fornire il contenuto che l'utente vuole condividere. È necessario specificare un titolo e i dati da condividere. Una descrizione è facoltativa, ma consigliata.
DataRequest request = args.Request;
È possibile condividere vari tipi di dati, tra cui:
- Testo normale
- Uniform Resource Identifiers (URIs)
- HTML
- Testo formattato
- Bitmap
- File
- Dati personalizzati definiti dallo sviluppatore
L'oggetto DataPackage può contenere uno o più di questi formati, in qualsiasi combinazione. L'esempio seguente mostra la condivisione dello stato:
request.Data.SetText("Hello world!");
Quando si creano pacchetti di dati per la condivisione, è possibile fornire un'ampia gamma di proprietà che forniscono informazioni aggiuntive sul contenuto condiviso. Queste proprietà consentono alle app di destinazione di migliorare l'esperienza utente. Ad esempio, una descrizione aiuta quando l'utente condivide il contenuto con più app. L'aggiunta di un'anteprima quando si condivide un'immagine o un collegamento a una pagina Web fornisce un riferimento visivo all'utente. Per altre informazioni, vedere DataPackagePropertySet.
Avviso
Tutte le proprietà, ad eccezione del titolo, sono facoltative. La proprietà title è obbligatoria e deve essere impostata.
request.Data.Properties.Title = "Share Example";
request.Data.Properties.Description = "A demonstration on how to share";
Un'interfaccia utente per la condivisione viene fornita dal sistema. Per avviarlo, chiamare il metodo ShowShareUI.
DataTransferManager.ShowShareUI();
Nella maggior parte dei casi, la condivisione del contenuto è un processo semplice. Tuttavia, c'è sempre una possibilità che qualcosa di imprevisto possa accadere. Ad esempio, l'app potrebbe richiedere all'utente di selezionare il contenuto per la condivisione, ma l'utente non ha selezionato alcun contenuto. Per gestire queste situazioni, utilizzare il metodo FailWithDisplayText , che visualizzerà un messaggio all'utente in caso di errore.
In alcuni casi, potrebbe non essere opportuno preparare immediatamente i dati che l'utente vuole condividere. Ad esempio, se l'app supporta l'invio di un file di immagine di grandi dimensioni in diversi formati possibili, è inefficiente creare tutte le immagini prima che l'utente effettui la selezione.
Per risolvere questo problema, un DataPackage può contenere un delegato, ovvero una funzione chiamata quando l'app ricevente richiede dati. È consigliabile usare un delegato ogni volta che i dati che un utente vuole condividere è a elevato utilizzo di risorse.
async void OnDeferredImageRequestedHandler(DataProviderRequest request)
{
// Provide updated bitmap data using delayed rendering
if (this.imageStream != null)
{
DataProviderDeferral deferral = request.GetDeferral();
InMemoryRandomAccessStream inMemoryStream = new InMemoryRandomAccessStream();
// Decode the image.
BitmapDecoder imageDecoder = await BitmapDecoder.CreateAsync(this.imageStream);
// Re-encode the image at 50% width and height.
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));
deferral.Complete();
}
}