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