【问题标题】:Sharing StorageItems from a byte[] array从 byte[] 数组共享 StorageItems
【发布时间】:2013-03-15 19:26:08
【问题描述】:

我想在我的 WinRT C# Metro 应用程序 (Windows Release Preview) 中实现共享源合同。我的应用程序正在存储任意文件。不在文件系统中,而是我通过 WCF 服务以byte[] 获取数据。现在我想在我的应用程序中分享这样的“文件”。

我看到的标准数据格式的唯一可能性是在DataPackage 上使用SetStorageItems() 方法。因此,我面临着将数据从我的字节数组转换为可以共享的StorageFile 的挑战。找到了StorageFile.CreateStreamedFileAsync()方法,想这样用:

// filename: string
// fileContent: byte[]

// ... setting DataPackage title and description ...

DataRequestDeferral deferral = args.Request.GetDeferral();

var file = await Windows.Storage.StorageFile.CreateStreamedFileAsync(filename,
    async stream => await stream.WriteAsync(fileContent.AsBuffer()), null);
args.Request.Data.SetStorageItems(new List<IStorageItem> { file });

deferral.Complete();

它编译得很好,但它没有按预期工作。我已经尝试使用标准邮件应用程序进行共享。邮件共享视图打开,我可以创建新邮件。该文件显示为没有缩略图(如预期的那样),但无法发送电子邮件。它显示发送进度几分钟,然后出现错误:“无法与邮件共享 {filename}。”。分享魅力显示“出了点问题”和“[...] 邮件现在无法分享。请稍后再试。”。

当我从文件系统加载StorageFile 时,它运行良好:邮件打开并在几秒钟内发送,这里没有问题。所以要么我使用CreateStreamedFileAsync() 错误,要么这个方法有错误,你怎么看?

【问题讨论】:

    标签: windows-8 microsoft-metro windows-runtime sharing


    【解决方案1】:

    在传递给 CreateStreamedFileAsync 的回调中,您需要实际处置对象 - 向操作系统发出信号表明您已完成。

    写了一个完整的例子here

    【讨论】:

      【解决方案2】:

      邮件应用不是共享文件的目标。来自http://blogs.msdn.com/b/b8/archive/2012/06/14/building-the-mail-app.aspx:“邮件支持分享文字、链接和图片。”

      请记住,共享合同有 2 个部分:共享源和共享目标。如您所知,它们之间可以共享许多不同的数据格式,例如文本、图片、URI 和文件。支持的不同数据格式的完整列表位于http://msdn.microsoft.com/en-us/library/windows/apps/hh771179.aspx

      我建议您使用 Share Target Sample 应用程序来测试您的文件是否被正确共享 - 共享到此,它将显示从您的应用程序共享的所有内容作为源(并且它确实接受文件进行共享) .您可以从http://code.msdn.microsoft.com/windowsapps/Sharing-Content-Target-App-e2689782 下载它。您还可以使用 Share Source Sample 应用程序作为示例,并利用此应用程序中的代码;您可以从http://code.msdn.microsoft.com/windowsapps/Sharing-Content-Source-App-d9bffd84 下载它。

      希望有帮助!

      【讨论】:

      • 如上所述:当我从物理文件夹加载文件时,一切正常。因此,我认为问题不在于合同本身,而在于提供的数据。此外,当我以标准数据格式共享 StorageItems 时,邮件应用程序仅显示为共享目标。如果我想共享 StandardDataFormats.Bitmap,Mail 应用程序不会出现。
      • 只是我对示例应用程序“共享内容目标应用程序”有问题 - code.msdn.microsoft.com/windowsapps/… 吗?当我想向这个应用分享内容时,分享视图会出现一秒钟,然后闪烁一次然后消失。这个应用程序有错误吗?也许您可以重现此问题...
      • 啊,我发现了问题:应用程序不能运行才能让共享工作。
      【解决方案3】:

      好的,邮件应用的预览版可能无法正确处理共享目标合同。使用来自 http://code.msdn.microsoft.com/windowsapps/Sharing-Content-Target-App-e2689782 的 SDK 示例应用程序“共享内容目标应用程序”,使用上面发布的 StorageFile.CreateStreamedFileAsync() 方法共享在内存中创建的 StorageItem 工作正常。

      因此,当您想要共享内存中的 byte[] 数组时,您应该采用这种方式。对于测试,当你想与它共享来自另一个应用程序的数据时,请确保共享目标应用程序不在 Visual Studio 中运行。然后分享侧边栏就神秘的自动消失了……

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多