我只是尝试使用Share Charm将 DocumentsLibrary 中名为 Document.pdf 的文件附加到电子邮件中。我的代码完全适用于本地计算机:
private async void OnDataRequestedFiles(DataTransferManager sender, DataRequestedEventArgs e)
{
List<IStorageItem> shares = new List<IStorageItem>();
StorageFile filetoShare = await Windows.Storage.KnownFolders.DocumentsLibrary.GetFileAsync("Document.pdf");
if (filetoShare != null)
{
shares.Add(filetoShare);
filetoShare = null;
}
if (shares != null)
{
DataPackage requestData = e.Request.Data;
requestData.Properties.Title = "Title";
requestData.Properties.Description = "Description"; // The description is optional.
requestData.SetStorageItems(shares);
shares = null;
}
else
{
e.Request.FailWithDisplayText("File not Found.");
}
}
但是当我在Windows Surface平板电脑上运行完全相同的代码时,我得到了可怕的“现在没有什么可以分享。”在魅力的右侧飞出区。
这里有更多帮助背景:
就像我说的,这可以按照预期在我的Win 8开发机上运行......只是不在Surface上。我想知道Surface是否有不同的文件或文件夹权限?
感谢您的帮助...这让我疯狂
答案 0 :(得分:2)
我终于明白了 - 问题是我的事件处理程序异步(这样我就可以使用等待来设置 StorageFile 变量)。
我通过在代码中设置 StorageFile 变量来解决它,以便在调用事件处理程序时它已经可用。
我仍然不知道为什么它在我的开发机器上工作,但在WinRT表面上没有...
答案 1 :(得分:2)
处理程序可以是异步方法。在这种情况下,使用DataTransferManager至关重要。请参阅the MSDN page specifically for this scenario。为方便起见,页面中的代码将复制到此处:
private void RegisterForShare()
{
DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager,
DataRequestedEventArgs>(this.ShareStorageItemsHandler);
}
private async void ShareStorageItemsHandler(DataTransferManager sender,
DataRequestedEventArgs e)
{
DataRequest request = e.Request;
request.Data.Properties.Title = "Share StorageItems Example";
request.Data.Properties.Description = "Demonstrates how to share files.";
// Because we are making async calls in the DataRequested event handler,
// we need to get the deferral first.
DataRequestDeferral deferral = request.GetDeferral();
// Make sure we always call Complete on the deferral.
try
{
StorageFile logoFile =
await Package.Current.InstalledLocation.GetFileAsync("Assets\\Logo.png");
List<IStorageItem> storageItems = new List<IStorageItem>();
storageItems.Add(logoFile);
request.Data.SetStorageItems(storageItems);
}
finally
{
deferral.Complete();
}
}
在调用任何异步方法之前放置以下语句至关重要:
DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
答案 2 :(得分:1)
你只有半秒钟才能完成整个工作(获取文件,附加......等)。如果发生半秒的截止日期,你会得到这个“疯狂的”消息。考虑实施一些可恢复的逻辑,并将消息替换为“正在准备附件,请在几秒钟后重试”(或者其他)。 您的WinRT设备可能比您的开发机器慢。后者只是在截止日期前完成工作......