我使用一个按钮创建了一个非常简单的 UWP 应用程序。点击它应该显示内置的共享弹出窗口分享一个PDF file.
事实上,我让它适用于 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(从其字节)?
感谢您的反馈意见。看起来创建流文件异步 https://learn.microsoft.com/en-us/uwp/api/Windows.Storage.StorageFile#Windows_Storage_StorageFile_CreateStreamedFileAsync_System_String_Windows_Storage_StreamedFileDataRequestedHandler_Windows_Storage_Streams_IRandomAccessStreamReference_方法不适用于移动设备中的共享合约。我们已在内部记录了此问题,一旦有任何进展,我将在此处更新。
目前,作为解决方法,您可以将文件存储在临时文件夹 https://learn.microsoft.com/en-us/uwp/api/windows.storage.applicationdata#Windows_Storage_ApplicationData_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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)