共享
本文介绍如何使用 .NET Multi-platform App UI (.NET MAUI) IShare 接口。 此接口提供一个 API,用于将数据(如文本或 Web 链接)发送到设备共享功能。
IShare
接口的默认实现通过 Share.Default 属性提供。 IShare
接口和 Share
类都包含在 Microsoft.Maui.ApplicationModel.DataTransfer
命名空间中。
发出共享请求后,设备会显示共享窗口,提示用户选择要与之共享的应用:
开始使用
要访问“共享”功能,需要以下特定于平台的设置:
无需设置。
共享文本和链接
共享功能的工作原理是调用具有数据有效负载的 RequestAsync 方法,该有效负载包括要共享给其他应用程序的信息。 ShareTextRequest.Text 和 ShareTextRequest.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
});
此处所述的所有内容同样适用于 Share 和 Launcher。
以下扩展方法可帮助计算视图的边界:
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 特定于平台的差异。
- ShareTextRequest.Subject 属性用于所需的消息主题。