共享

Browse sample. 浏览示例

本文介绍如何使用 .NET Multi-platform App UI (.NET MAUI) IShare 接口。 此接口提供一个 API,用于将数据(如文本或 Web 链接)发送到设备共享功能。

IShare 接口的默认实现通过 Share.Default 属性提供。 IShare 接口和 Share 类都包含在 Microsoft.Maui.ApplicationModel.DataTransfer 命名空间中。

发出共享请求后,设备会显示共享窗口,提示用户选择要与之共享的应用:

Share from your app to a different app

开始使用

要访问“共享”功能,需要以下特定于平台的设置:

无需设置。

共享功能的工作原理是调用具有数据有效负载的 RequestAsync 方法,该有效负载包括要共享给其他应用程序的信息。 ShareTextRequest.TextShareTextRequest.Uri 可以混合使用,每个平台都将根据内容进行筛选处理。

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

共享文件

还可以将文件共享到设备上的其他应用程序。 .NET MAUI 会自动检测文件类型 (MIME) 并请求共享。 但是,操作系统可能会限制可以共享哪些类型的文件。 要共享单个文件,请使用 ShareFileRequest 类型。

以下代码示例将文本文件写入设备,然后请求共享此文件:

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

共享多个文件

共享多个文件与共享单个文件略有不同。 要共享单个文件,请使用 ShareMultipleFilesRequest 类型。

以下代码示例将两个文本文件写入设备,然后请求共享这些文件:

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

呈现位置

重要

本部分仅适用于 iPadOS。

在 iPadOS 上请求共享或打开启动器时,可以在弹出框中显示它。 这指定将显示弹出框且箭头直接指向的位置。 此位置通常是启动该操作的控件。 可以使用 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
    });

此处所述的所有内容同样适用于 ShareLauncher

以下扩展方法可帮助计算视图的边界:

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

那么可以在调用 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
    }
}

当触发 Command 时,可以传入调用元素:

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

有关 ViewHelpers 类的示例,请参阅 GitHub 上托管的 .NET MAUI 示例

平台差异

本部分介绍共享 API 特定于平台的差异。