我用一个按钮创建了一个非常简单的UWP应用程序。点击应显示内置共享弹出窗口以共享 PDF文件。
事实是,我有它适用于Windows 10(桌面),但它不适用于移动设备(弹出窗口不会出现在屏幕上)。
PDF文件以字节数组形式出现(因为它来自远程服务)。
这是 MainPage.xaml.cs
中的代码public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
DataTransferManager.GetForCurrentView().DataRequested += OnDataRequested;
}
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
// This should come from a service
PdfBytes = await Microsoft.Toolkit.Uwp.StorageFileHelper.ReadBytesFromPackagedFileAsync("Document.pdf");
}
public byte[] PdfBytes { get; set; }
private async void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
var deferral = args.Request.GetDeferral();
var si = await StorageFile.CreateStreamedFileAsync("Document.pdf", stream =>
{
var writeStream = stream.AsStreamForWrite();
writeStream.Write(PdfBytes, 0, PdfBytes.Length);
stream.Dispose();
}, null);
args.Request.Data.Properties.Title = "PDF Document";
args.Request.Data.Properties.Description = "Some description";
args.Request.Data.SetStorageItems(new IStorageItem[] { si });
deferral.Complete();
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
DataTransferManager.ShowShareUI();
}
}
这是对的吗?如果不是,我该如何共享PDF(从其字节开始)?
答案 0 :(得分:1)
感谢您的反馈。似乎CreateStreamedFileAsync方法在移动中与Share合同无法正常工作。我们已在内部记录此问题,一旦有任何进展,我会在此处更新。
目前,作为解决方法,您可以先将文件存储在TemporaryFolder中,然后按以下方式共享:
private async void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
var deferral = args.Request.GetDeferral();
var tempFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync("Document.pdf", CreationCollisionOption.ReplaceExisting);
await FileIO.WriteBytesAsync(tempFile, PdfBytes);
args.Request.Data.Properties.Title = "PDF Document";
args.Request.Data.Properties.Description = "Some description";
args.Request.Data.SetStorageItems(new IStorageItem[] { tempFile });
deferral.Complete();
}
临时应用数据存储是您不希望在当前应用会话后保留的数据的正确位置。系统可以根据需要删除存储在该位置的数据以释放空间。您可以将它用于任何中间或临时文件。如果要向Temp写入大量数据,最好在初始化应用程序时清除它,以避免系统或用户必须采取措施释放存储空间。你可以通过致电:
来做到这一点await ApplicationData.ClearAsync(ApplicationDataLocality.Temporary);
答案 1 :(得分:0)
你有类似的问题我相信
您是否尝试过更改
textView1
我还没有检查过这段代码,所以它可能不会编译但是我发现我的问题看起来与你的相似,如果涉及到线程的话。在这里查看我的问题UWP DataTransferManager ShowShareUI() Opens Sharing Dialog with "This app can't share right now" and Closes it Immediately After
答案 2 :(得分:0)
我遇到了同样的问题,我的分享在桌面应用程序中运行良好但在移动设备中运行不佳。经过大的挣扎后,我发现推迟在Windows 10 mobile中无效。
所以最好删除这些行并尝试。它的工作
var deferral = args.Request.GetDeferral();
deferral.Complete();