Condividi tramite


Condividi

Browse sample. Esplorare l'esempio

Questo articolo descrive come usare l'interfaccia dell'interfaccia utente dell'app multipiattaforma .NET (.NET MAUI). IShare Questa interfaccia fornisce un'API per inviare dati, ad esempio collegamenti di testo o Web, alla funzione di condivisione dei dispositivi.

L'implementazione predefinita dell'interfaccia IShare è disponibile tramite la Share.Default proprietà . Sia l'interfaccia che Share la IShare classe sono contenute nello spazio dei Microsoft.Maui.ApplicationModel.DataTransfer nomi .

Quando viene effettuata una richiesta di condivisione, il dispositivo visualizza una finestra di condivisione, richiedendo all'utente di scegliere un'app con cui condividere:

Share from your app to a different app

Introduzione

Per accedere alla funzionalità Condividi , è necessaria la configurazione specifica della piattaforma seguente:

Non è necessaria alcuna configurazione.

La funzionalità di condivisione funziona chiamando il RequestAsync metodo con un payload di dati che include informazioni da condividere con altre applicazioni. ShareTextRequest.Text e ShareTextRequest.Uri possono essere misti e ogni piattaforma gestirà il filtro in base al contenuto.

public async Task ShareText(string text)
{
    await Share.Default.RequestAsync(new ShareTextRequest
    {
        Text = text,
        Title = "Share Text"
    });
}

public async Task ShareUri(string uri, IShare share)
{
    await share.RequestAsync(new ShareTextRequest
    {
        Uri = uri,
        Title = "Share Web Link"
    });
}

Condividere un file

È anche possibile condividere file in altre applicazioni nel dispositivo. .NET MAUI rileva automaticamente il tipo di file (MIME) e richiede una condivisione. Tuttavia, i sistemi operativi possono limitare i tipi di file che possono essere condivisi. Per condividere un singolo file, usare il ShareFileRequest tipo .

L'esempio di codice seguente scrive un file di testo nel dispositivo e quindi richiede di condividerlo:

public async Task ShareFile()
{
    string fn = "Attachment.txt";
    string file = Path.Combine(FileSystem.CacheDirectory, fn);

    File.WriteAllText(file, "Hello World");

    await Share.Default.RequestAsync(new ShareFileRequest
    {
        Title = "Share text file",
        File = new ShareFile(file)
    });
}

Condividere più file

La condivisione di più file è leggermente diversa dalla condivisione di un singolo file. Per condividere un singolo file, usare il ShareMultipleFilesRequest tipo .

L'esempio di codice seguente scrive due file di testo nel dispositivo e quindi richiede di condividerli:

public async Task ShareMultipleFiles()
{
    string file1 = Path.Combine(FileSystem.CacheDirectory, "Attachment1.txt");
    string file2 = Path.Combine(FileSystem.CacheDirectory, "Attachment2.txt");

    File.WriteAllText(file1, "Content 1");
    File.WriteAllText(file2, "Content 2");

    await Share.Default.RequestAsync(new ShareMultipleFilesRequest
    {
        Title = "Share multiple files",
        Files = new List<ShareFile> { new ShareFile(file1), new ShareFile(file2) }
    });
}

Posizione presentazione

Importante

Questa sezione si applica solo a iPadOS.

Quando si richiede una condivisione o si apre un'utilità di avvio in iPadOS, è possibile presentarla in un popover. Specifica dove verrà visualizzato il popover e puntare direttamente una freccia. Questa posizione è spesso il controllo che ha avviato l'azione. È possibile specificare la posizione usando la proprietà PresentationSourceBounds:

await Share.RequestAsync(new ShareFileRequest
    {
        Title = Title,
        File = new ShareFile(file),
        PresentationSourceBounds = DeviceInfo.Platform == DevicePlatform.iOS && DeviceInfo.Idiom == DeviceIdiom.Tablet
                                ? new Rect(0, 20, 0, 0)
                                : Rect.Zero
    });
await Launcher.OpenAsync(new OpenFileRequest
    {
        File = new ReadOnlyFile(file),
        PresentationSourceBounds = DeviceInfo.Platform == DevicePlatform.iOS && DeviceInfo.Idiom == DeviceIdiom.Tablet
                                ? new Rect(0, 20, 0, 0)
                                : Rect.Zero
    });

Tutti gli elementi descritti qui funzionano allo stesso modo per Share e Launcher.

Ecco un metodo di estensione che consente di calcolare i limiti di una visualizzazione:

public static class ViewHelpers
{
    public static Rect GetAbsoluteBounds(this Microsoft.Maui.Controls.View element)
    {
        Element looper = element;

        var absoluteX = element.X + element.Margin.Top;
        var absoluteY = element.Y + element.Margin.Left;

        // Add logic to handle titles, headers, or other non-view bars

        while (looper.Parent != null)
        {
            looper = looper.Parent;
            if (looper is Microsoft.Maui.Controls.View v)
            {
                absoluteX += v.X + v.Margin.Top;
                absoluteY += v.Y + v.Margin.Left;
            }
        }

        return new Rect(absoluteX, absoluteY, element.Width, element.Height);
    }
}

Questa operazione può quindi essere usata quando si chiama RequestAsync:

public Command<Microsoft.Maui.Controls.View> ShareCommand { get; } = new Command<Microsoft.Maui.Controls.View>(Share);

async void Share(Microsoft.Maui.Controls.View element)
{
    try
    {
        await Share.Default.RequestAsync(new ShareTextRequest
        {
            PresentationSourceBounds = element.GetAbsoluteBounds(),
            Title = "Title",
            Text = "Text"
        });
    }
    catch (Exception)
    {
        // Handle exception that share failed
    }
}

È possibile passare l'elemento chiamante quando Command viene attivato:

<Button Text="Share"
        Command="{Binding ShareWithFriendsCommand}"
        CommandParameter="{Binding Source={RelativeSource Self}}"/>

Per un esempio della ViewHelpers classe , vedere l'esempio DI MAUI .NET ospitato in GitHub.

Differenze tra le piattaforme

Questa sezione descrive le differenze specifiche della piattaforma con l'API di condivisione.