Ricevere dati condivisi nell'app Windows

Il contratto di condivisione Windows consente alla tua app di essere visualizzata nel foglio di condivisione Windows come app di destinazione, consentendo agli utenti di condividere contenuti da altre app direttamente nei tuoi. Questo articolo illustra come gestire il contenuto condiviso dopo l'attivazione dell'app come destinazione di condivisione.

Prima di seguire questa procedura, registrare l'app come destinazione di condivisione:

Note

Il modello di attivazione per le app desktop WinUI 3 differisce da UWP. In WinUI 3 l'attivazione della condivisione viene gestita tramite AppInstance.GetActivatedEventArgs() nel codice di avvio dell'app, non tramite Application.OnShareTargetActivated(). Le ShareOperation API e DataPackageView descritte in questo articolo funzionano allo stesso modo dopo aver ottenuto .ShareTargetActivatedEventArgs Vedere Integrare app in pacchetto con Windows Condivisione per il modello di attivazione SDK per app di Windows.

Scegliere i formati di dati da supportare

Quando dichiari l'app come destinazione di condivisione nel manifesto del pacchetto, specifichi i tipi di file e i formati di dati che l'app può ricevere. Solo le app che supportano i formati condivisi vengono visualizzate nel foglio di condivisione.

È possibile configurare i tipi supportati in due modi:

Uso dell'editor del manifesto di Visual Studio:

  1. Apri package.appxmanifest in Visual Studio.
  2. Selezionare la scheda Dichiarazioni .
  3. Scegliere Condividi destinazione dall'elenco Dichiarazioni disponibili e quindi selezionare Aggiungi.
  4. In Tipi di file supportati aggiungere le estensioni di file gestite dall'app ( ad esempio , .jpg). .png Selezionare SupportsAnyFileType per accettare tutti i tipi di file.
  5. In Formati dati aggiungere i nomi di formato gestiti dall'app (ad esempio, Text, Uri, Bitmap).

Direttamente nel file XML del manifesto:

<Extensions>
  <uap:Extension Category="windows.shareTarget">
    <uap:ShareTarget>
      <uap:SupportedFileTypes>
        <uap:SupportsAnyFileType />
      </uap:SupportedFileTypes>
      <uap:DataFormat>Text</uap:DataFormat>
      <uap:DataFormat>Uri</uap:DataFormat>
      <uap:DataFormat>Bitmap</uap:DataFormat>
      <uap:DataFormat>StorageItems</uap:DataFormat>
    </uap:ShareTarget>
  </uap:Extension>
</Extensions>

Registrarsi solo per i formati che l'app può gestire. Se si dichiara un formato ma non è possibile elaborarlo, l'esperienza utente ne risente.

Leggere dati condivisi

Quando l'app viene attivata come destinazione di condivisione, si riceve un oggetto ShareOperation tramite ShareTargetActivatedEventArgs. La proprietà Data è un oggetto DataPackageView che espone il contenuto condiviso.

Usare Contains per verificare quali formati sono disponibili, quindi chiamare il metodo asincrono appropriato per recuperare i dati:

ShareOperation shareOperation = args.ShareOperation;

if (shareOperation.Data.Contains(StandardDataFormats.Text))
{
    string text = await shareOperation.Data.GetTextAsync();
    // Process the shared text.
}

if (shareOperation.Data.Contains(StandardDataFormats.WebLink))
{
    Uri webLink = await shareOperation.Data.GetWebLinkAsync();
    // Process the shared link.
}

if (shareOperation.Data.Contains(StandardDataFormats.StorageItems))
{
    IReadOnlyList<IStorageItem> items = await shareOperation.Data.GetStorageItemsAsync();
    // Process the shared files or folders.
}

Stato di condivisione del report

Se l'elaborazione dei dati condivisi richiede tempo, ad esempio il caricamento di file in un server, segnala lo stato di avanzamento al sistema usando i metodi di stato ShareOperation . In questo modo il sistema gestisce il ciclo di vita dell'app di origine in modo appropriato.

Chiama questi metodi in ordine man mano che l'operazione di condivisione procede:

Method Quando chiamare
ReportStarted Non appena l'app inizia a elaborare la condivisione. Dopo questo punto, non aspettatevi un'ulteriore interazione dell'utente con l'interfaccia utente di condivisione.
DatiDelReportRecuperati Dopo che l'app ha ottenuto tutti i dati necessari da DataPackageView. In questo modo il sistema può sospendere o terminare l'app di origine.
ReportSubmittedBackgroundTask Se l'app continua l'elaborazione in background dopo la chiusura dell'interfaccia utente di condivisione.
ReportCompletato Quando l'app ha completato correttamente l'elaborazione del contenuto condiviso.
SegnalaErrore Se si verifica un errore grave. L'utente visualizza il messaggio e termina l'operazione di condivisione.
shareOperation.ReportStarted();

try
{
    string text = await shareOperation.Data.GetTextAsync();
    shareOperation.ReportDataRetrieved();

    // Perform any additional processing here...
    await ProcessSharedDataAsync(text);

    shareOperation.ReportCompleted();
}
catch (Exception)
{
    shareOperation.ReportError("Something went wrong. Please try again.");
}

Note

Chiamare ReportError solo in caso di errori abbastanza gravi da interrompere l'operazione di condivisione. Per gli errori ripristinabili, è possibile continuare l'elaborazione senza chiamare ReportError.

Note

In alcuni casi un'app di destinazione può chiamare ReportDataRetrieved prima di ReportStarted: ad esempio, se l'app recupera i dati nell'ambito della gestione dell'attivazione, ma chiama ReportStarted solo in un secondo momento, quando l'utente seleziona esplicitamente un pulsante Condividi.

Quando un utente condivide il contenuto dell'app, puoi restituire un collegamento rapido per velocizzare la condivisione futura. Un QuickLink oggetto viene visualizzato come collegamento nel foglio di condivisione, ad esempio un collegamento di contatto che consente all'utente di condividere rapidamente con tale contatto senza spostarsi nell'interfaccia utente dell'app.

Un QuickLink oggetto ha un titolo, un'icona e un ID. L'ID è l'identificatore interno dell'app per la scorciatoia, ad esempio l'ID di un contatto o il nome di un account. Quando l'utente seleziona in un secondo momento un oggetto QuickLink, il sistema attiva l'app e passa nuovamente l'ID QuickLink tramite ShareOperation.QuickLinkId.

Restituisci un QuickLink passandolo a ReportCompleted:

private async Task ReportCompletedWithQuickLink(
    ShareOperation shareOperation, string quickLinkId, string quickLinkTitle)
{
    QuickLink quickLinkInfo = new QuickLink
    {
        Id = quickLinkId,
        Title = quickLinkTitle,

        // QuickLink supported types are configured independently from the manifest.
        SupportedFileTypes = { "*" },
        SupportedDataFormats =
        {
            StandardDataFormats.Text,
            StandardDataFormats.WebLink,
            StandardDataFormats.Bitmap,
            StandardDataFormats.StorageItems
        }
    };

    StorageFile iconFile = await Windows.ApplicationModel.Package.Current
        .InstalledLocation.CreateFileAsync(
            "assets\\contact.png", CreationCollisionOption.OpenIfExists);
    quickLinkInfo.Thumbnail = RandomAccessStreamReference.CreateFromFile(iconFile);

    shareOperation.ReportCompleted(quickLinkInfo);
}

Note

Un QuickLink memorizza solo l'ID, non i dati associati. L'app è responsabile della persistenza di tutti i dati utente (ad esempio i dettagli di contatto) e di recuperarli quando QuickLink viene attivato tramite ShareOperation.QuickLinkId.

Vedere anche