在Windows Metro应用程序C#/XAML中使用共享魅力以编程方式将文件附加到电子邮件时出现问题



我只是想使用共享魅力将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 Tablet上运行完全相同的代码时,我会在右侧的Charms弹出区域中看到可怕的"现在没有什么可共享的。">

以下是更多的背景信息:

  • 我不是想要使用文件选取器。。。我知道我要找的确切文件
  • 我已经在清单中启用了文档库功能
  • 我在清单中添加了pdf的文件类型关联
  • 是的,该文件确实存在并且在文档库中
  • 电子邮件帐户已在邮件应用程序中正确设置
  • 我可以成功地从平板电脑发送文本电子邮件。。。只是不包括带有附件的电子邮件

就像我所说的,这在我的Win 8开发机器上可以正常工作。。。只是不在表面上。我想知道Surface是否具有不同的文件或文件夹权限?

谢谢你的帮助。。。这让我抓狂

我终于明白了——问题是我的事件处理程序是async(这样我就可以使用wait设置StorageFile变量)。

我通过在代码的早期设置StorageFile变量来解决此问题,以便在调用事件处理程序时该变量已经可用。

我仍然不知道为什么它在我的开发机器上工作,但在WinRT表面上没有。。。

处理程序可以是异步方法。在这种情况下,使用DataTransferManager至关重要。请专门参考MSDN页面了解此场景。为了您的方便,页面中的代码被复制到这里:

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(); 

你只有半秒钟的时间来完成整个工作(获取文件、附加…等)。如果半秒钟的截止日期到来,你会收到这条"疯狂驾驶"的消息。考虑实现一些可恢复的逻辑,并将消息替换为"附件正在准备中,请稍后再试"(否则)。您的WinRT设备可能只是比您的开发机器慢。后者只是在截止日期前完成工作。。。

最新更新