3

我只是尝试使用 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 平板电脑上运行完全相同的代码时,我会感到可怕的“现在没有什么可分享的”。在 Charms 弹出区域的右侧。

这里有一些背景知识可以提供帮助:

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

就像我说的那样,这可以在我的 Win 8 开发机器上正常运行……只是在 Surface 上不行。我想知道 Surface 是否有不同的文件或文件夹权限?

感谢您的帮助...这让我发疯

4

3 回答 3

2

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

我通过在代码前面设置StorageFile变量来解决它,以便在调用事件处理程序时它已经可用。

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

于 2012-11-16T20:37:50.493 回答
2

处理程序可以是异步方法。在这种情况下,使用 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(); 
于 2014-02-07T23:06:27.173 回答
1

您只有半秒钟的时间来完成整个工作(获取文件、附加...等)。如果出现半秒截止日期,您将收到此“疯狂驾驶”消息。考虑实施一些可恢复的逻辑并将消息替换为“正在准备附件,请在几秒钟后重试”(或其他)。你的 WinRT 设备可能只是比你的开发机器慢。后者只是在截止日期前完成工作......

于 2014-01-07T21:55:13.657 回答