Partager via


Partager

Browse sample. Parcourir l’exemple

Cet article explique comment utiliser l’interface utilisateur de l’application multiplateforme .NET (.NET MAUI). IShare Cette interface fournit une API pour envoyer des données, telles que du texte ou des liens web, à la fonction de partage d’appareils.

L’implémentation par défaut de l’interface IShare est disponible via la Share.Default propriété. L’interface et Share la IShare classe sont contenues dans l’espace Microsoft.Maui.ApplicationModel.DataTransfer de noms.

Lorsqu’une demande de partage est effectuée, l’appareil affiche une fenêtre de partage, invitant l’utilisateur à choisir une application à partager avec :

Share from your app to a different app

Démarrage

Pour accéder à la fonctionnalité Partager, la configuration spécifique à la plateforme suivante est requise :

Aucune configuration n’est requise.

La fonctionnalité de partage fonctionne en appelant la RequestAsync méthode avec une charge utile de données qui inclut des informations à partager avec d’autres applications. ShareTextRequest.Text et peut être mixte et ShareTextRequest.Uri chaque plateforme gère le filtrage en fonction du contenu.

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

Partager un fichier

Vous pouvez également partager des fichiers vers d’autres applications sur l’appareil. .NET MAUI détecte automatiquement le type de fichier (MIME) et demande un partage. Toutefois, les systèmes d’exploitation peuvent restreindre les types de fichiers pouvant être partagés. Pour partager un seul fichier, utilisez le ShareFileRequest type.

L’exemple de code suivant écrit un fichier texte sur l’appareil, puis demande de le partager :

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

Partager plusieurs fichiers

Le partage de plusieurs fichiers est légèrement différent du partage d’un seul fichier. Pour partager un seul fichier, utilisez le ShareMultipleFilesRequest type.

L’exemple de code suivant écrit deux fichiers texte sur l’appareil, puis demande de les partager :

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

Emplacement de présentation

Important

Cette section s’applique uniquement à iPadOS.

Lors de la demande d’un partage ou d’un lanceur d’ouverture sur iPadOS, vous pouvez le présenter dans une fenêtre contextuelle. Cela spécifie où la fenêtre contextuelle s’affiche et pointe directement vers une flèche. Cet emplacement est souvent le contrôle qui a lancé l’action. Vous pouvez spécifier l’emplacement à l'aide de la propriété 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
    });

Tout ce qui est décrit ici fonctionne de manière égale pour Share et Launcher.

Voici une méthode d’extension qui permet de calculer les limites d’une vue :

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

Cela peut ensuite être utilisé lors de l’appel 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
    }
}

Vous pouvez transmettre l’élément appelant lorsque l’élément Command est déclenché :

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

Pour obtenir un exemple de classe ViewHelpers , consultez l’exemple .NET MAUI hébergé sur GitHub.

Différences de plateforme

Cette section décrit les différences spécifiques à la plateforme avec l’API de partage.