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

Windows 8 在Windows Metro应用程序C#/XAML中使用Share Charm以编程方式将文件附加到电子邮件时出现问题,windows-8,windows-runtime,charms-bar,Windows 8,Windows Runtime,Charms Bar,我只是想用共享符将文档库中名为Document.pdf的文件附加到电子邮件中。我的以下代码在本地计算机上运行良好: private async void OnDataRequestedFiles(DataTransferManager sender, DataRequestedEventArgs e) { List<IStorageItem> shares = new List<IStorageItem>(); Storag

我只是想用共享符将文档库中名为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.");
        }
    }
私有异步无效OnDataRequestedFiles(DataTransferManager发送方,DataRequestedEventArgs e)
{
列表共享=新列表();
StorageFile filetoShare=等待Windows.Storage.KnownFolders.DocumentsLibrary.GetFileAsync(“Document.pdf”);
如果(filetoShare!=null)
{
股份。添加(文件共享);
filetoShare=null;
}
如果(共享!=null)
{
DataPackage requestData=e.Request.Data;
requestData.Properties.Title=“Title”;
requestData.Properties.Description=“Description”//描述是可选的。
requestData.SetStorage项目(共享);
股票=空;
}
其他的
{
e、 Request.FailWithDisplayText(“未找到文件”);
}
}
但是,当我在Windows Surface平板电脑上运行完全相同的代码时,我会看到可怕的“现在没有什么可共享的。”
在右侧的“魅力”弹出区

这里有更多的背景资料可以帮助您:

  • 我不想使用文件选择器…我知道我要找的确切文件
  • 我已经在清单中启用了文档库功能
  • 我在清单中添加了pdf的文件类型关联
  • 是的,文件确实存在并且在文档库中
  • 在surface的Mail应用程序中正确设置了电子邮件帐户
  • 我可以成功地从平板电脑发送文本电子邮件…但不能发送带有附件的电子邮件
正如我所说,这在我的Win 8开发机器上工作,正如预期的那样…只是表面上没有。我想知道Surface是否具有不同的文件或文件夹权限


感谢您的帮助…这让我抓狂了

我终于找到了答案-问题是我的事件处理程序是异步的(这样我就可以使用等待来设置存储文件变量)

我在代码前面设置了StorageFile变量,这样在调用事件处理程序时它就已经可用了


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

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

处理程序可以是异步方法。在这种情况下,使用DataTransferManager至关重要。请参阅。为方便起见,将页面中的代码复制到此处:

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

当你使用非管理员帐户时,这个过程在你的本地机器上有效吗?@AlSki-我相信你关于使用非管理员帐户的评论是正确的(我必须将PDF写入并存储在不同的目录中)…谢谢你指出这一点。我添加了一个适用于管理员帐户的答案
DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();