Freigeben über


Freigeben

Browse sample. Durchsuchen Sie das Beispiel

In diesem Artikel wird beschrieben, wie Sie die .NET Multi-Platform App UI (.NET MAUI) IShare-Schnittstelle verwenden können. Diese Schnittstelle stellt eine API zum Senden von Daten wie Text oder Weblinks an die Gerätefreigabefunktion bereit.

Die Standardimplementierung der IShare-Schnittstelle ist über die Share.Default-Eigenschaft verfügbar. Die IShare-Schnittstelle sowie die Share-Klasse sind im Microsoft.Maui.ApplicationModel.DataTransfer-Namespace enthalten.

Wenn eine Freigabeanforderung gestellt wird, zeigt das Gerät ein Freigabefenster an und fordert den*die Benutzer*in auf, eine App für die Freigabe auszuwählen:

Share from your app to a different app

Erste Schritte

Für den Zugriff auf die Freigabe-Funktion ist die folgende plattformspezifische Einrichtung erforderlich.

Es ist kein Setup erforderlich.

Die „Teilen“-Funktion ruft die RequestAsync-Methode mit einer Datennutzlast auf, die Informationen zum Teilen mit anderen Anwendungen enthält. ShareTextRequest.Text und ShareTextRequest.Uri können kombiniert werden, und bei jeder Plattform erfolgt die Filterung anhand des Inhalts.

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

Freigeben einer Datei

Sie können Dateien auch für andere Anwendungen auf dem Gerät freigeben. .NET MAUI erkennt automatisch den Dateityp (MIME) und fordert eine Dateifreigabe an. Betriebssysteme können jedoch einschränken, welche Dateitypen freigegeben werden können. Wenn Sie eine einzelne Datei freigeben möchten, verwenden Sie den ShareFileRequest-Typ.

Im folgenden Codebeispiel wird eine Textdatei auf das Gerät geschrieben, und dann wird angefordert, sie freizugeben:

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

Freigeben mehrerer Dateien

Das Freigeben mehrerer Dateien unterscheidet sich geringfügig von der Freigabe einer einzelnen Datei. Wenn Sie eine einzelne Datei freigeben möchten, verwenden Sie den ShareMultipleFilesRequest-Typ.

Im folgenden Codebeispiel werden zwei Textdateien auf das Gerät geschrieben, und dann wird angefordert, sie freizugeben:

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

Präsentationsspeicherort

Wichtig

Dieser Abschnitt gilt nur für iPadOS.

Wenn Sie unter iPadOS eine Freigabe oder ein Anfangsstartprogramm anfordern, haben Sie die Möglichkeit, die Präsentation in einem Popover zu zeigen. Damit wird angegeben, wo das Popover angezeigt wird, und mit einem Pfeil direkt darauf verwiesen. Oftmals ist dies das Steuerelement, mit dem die Aktion gestartet wurde. Sie können den Speicherort mithilfe der PresentationSourceBounds-Eigenschaft angeben:

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

Alles, was hier beschrieben wird, funktioniert gleichermaßen für Share und Launcher.

Hier ist eine Erweiterungsmethode, mit der die Grenzen einer Ansicht berechnet werden:

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

Diese können dann beim Aufruf von RequestAsync verwendet werden:

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

Sie können das aufrufende Element übergeben, wenn der Command ausgelöst wird:

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

Ein Beispiel für die ViewHelpers-Klasse finden Sie im .NET MAUI-Beispiel, das auf GitHub gehostet wird.

Plattformunterschiede

In diesem Abschnitt werden die plattformspezifischen Unterschiede bei der Freigabe-API beschrieben.