无法使用Share Charm以编程方式将文件附加到Windows Metro App C#/ XAML中的电子邮件

时间:2012-11-14 04:19:17

标签: windows-8 windows-runtime charms-bar

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

这里有更多帮助背景:

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

就像我说的,这可以按照预期在我的Win 8开发机上运行......只是不在Surface上。我想知道Surface是否有不同的文件或文件夹权限?

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

3 个答案:

答案 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设备可能比您的开发机器慢。后者只是在截止日期前完成工作......