Compartilhar

Browse sample. Navegue pelo exemplo

Este artigo descreve como você pode usar a interface .NET Multi-platform App UI (.NET MAUI). IShare Essa interface fornece uma API para enviar dados, como texto ou links da Web, para a função de compartilhamento de dispositivos.

A implementação padrão da interface está disponível por meio da IShareShare.Default propriedade. A interface e Share a IShare classe estão contidas no Microsoft.Maui.ApplicationModel.DataTransfer namespace.

Quando uma solicitação de compartilhamento é feita, o dispositivo exibe uma janela de compartilhamento, solicitando que o usuário escolha um aplicativo com o qual compartilhar:

Share from your app to a different app

Introdução

Para acessar a funcionalidade de compartilhamento, é necessária a seguinte configuração específica da plataforma:

Nenhuma confiuração é necessária.

A funcionalidade de compartilhamento funciona chamando o RequestAsync método com uma carga de dados que inclui informações para compartilhar com outros aplicativos. ShareTextRequest.Text e pode ser misturado e ShareTextRequest.Uri cada plataforma lidará com a filtragem com base no conteúdo.

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"
    });
}

Compartilhar um arquivo

Você também pode compartilhar arquivos com outros aplicativos no dispositivo. O .NET MAUI detecta automaticamente o tipo de arquivo (MIME) e solicita um compartilhamento. No entanto, os sistemas operacionais podem restringir quais tipos de arquivos podem ser compartilhados. Para compartilhar um único arquivo, use o ShareFileRequest tipo.

O exemplo de código a seguir grava um arquivo de texto no dispositivo e, em seguida, solicita compartilhá-lo:

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)
    });
}

Compartilhar vários arquivos

Compartilhar vários arquivos é um pouco diferente de compartilhar um único arquivo. Para compartilhar um único arquivo, use o ShareMultipleFilesRequest tipo.

O exemplo de código a seguir grava dois arquivos de texto no dispositivo e, em seguida, solicita compartilhá-los:

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) }
    });
}

Local da apresentação

Importante

Esta seção só se aplica ao iPadOS.

Ao solicitar um compartilhamento ou abrir o iniciador no iPadOS, você pode apresentá-lo em um popover. Isso especifica onde o popover aparecerá e aponte uma seta diretamente. Esse local geralmente é o controle que iniciou a ação. Você pode especificar a localização usando a propriedade 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
    });

Tudo descrito aqui funciona igualmente para Share e Launcher.

Aqui está um método de extensão que ajuda a calcular os limites de uma exibição:

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);
    }
}

Isso pode ser usado ao chamar 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
    }
}

Você pode passar o elemento de chamada quando o Command é acionado:

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

Para obter um exemplo da ViewHelpers classe, consulte o .NET MAUI Sample hospedado no GitHub.

Diferenças de plataforma

Esta seção descreve as diferenças específicas da plataforma com a API de compartilhamento.