Xamarin.iOS:分享文件sheet只出现两秒

Xamarin.iOS: Share file sheet appears only for two seconds

Xamarin.Essentials 提供了一种共享本地文件的机制。典型用例:

await Share.RequestAsync(new ShareFileRequest
{
    Title = "Sharing a file...",
    File = new ShareFile(pathToLocalFile),
});

pathToLocalFile - 包含必须共享的本地文件的绝对路径。

虽然此代码在 Android 上完美运行,但在 iOS 上却无法按预期运行。

在 iOS 上“共享文件”sheet 只出现了几秒钟然后就消失了。

我该如何解决这个问题?

我检查了与此功能相关的 Xamarin.Essentials sample,并得出以下结论。

ShareFileRequest class 有 PresentationSourceBounds 应设置为 parent 视图元素的边界。

“共享文件”功能应从可见视图元素调用,例如通过单击页面上的按钮。从菜单项调用此功能不起作用。

所以,我创建了一个页面,并在页面 xaml 中声明了这样的按钮:

<Button Text="Click here to share the file..." 
        Command="{Binding ShareLocalFileCommand}" 
        CommandParameter="{Binding Source={RelativeSource Self}}" />

在页面视图模型中,我这样声明 ShareLocalFileCommand

public Command<View> ShareLocalFileCommand { get; }

在视图模型构造函数中,我已经像这样初始化了 ShareLocalFileCommand 属性:

ShareLocalFileCommand = new Command<View>(ExecuteShareLocalFileCommandAsync);

并且相关的方法已经实现了:

private async void ExecuteShareLocalFileCommandAsync(View viewElement)
{
    await Share.RequestAsync(new ShareFileRequest
    {
        Title = "Sharing local file...",
        File = new ShareFile(LocalFilePath), // LocalFilePath contains path to local file to be shared
        PresentationSourceBounds = GetAbsoluteBounds(viewElement)
    });
}


private static System.Drawing.Rectangle GetAbsoluteBounds(View element)
{
    Element looper = element;

    var absoluteX = element.X + element.Margin.Top;
    var absoluteY = element.Y + element.Margin.Left;

    while (looper.Parent != null)
    {
        looper = looper.Parent;
        if (looper is View view)
        {
            absoluteX += view.X + view.Margin.Top;
            absoluteY += view.Y + view.Margin.Left;
        }
    }

    return new System.Drawing.Rectangle((int)absoluteX, (int)absoluteY, (int)element.Width, (int)element.Height);
}

请注意,在您点击按钮和调用 await Share.RequestAsync() 之间不应有任何视图元素出现和消失,如确认对话框等。否则 viewElement 参数将被传递作为 null.