1

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

我看到的标准数据格式的唯一可能性是SetStorageItems()使用DataPackage. 因此,我面临着将数据从我的字节数组转换为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()错了,要么这个方法有一个错误,你怎么看?

4

3 回答 3

1

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

在这里写了一个完整的例子

于 2013-03-15T11:26:08.600 回答
0

邮件应用程序不是共享文件的目标。来自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下载它。

希望有帮助!

于 2012-07-23T14:56:01.600 回答
0

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

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

于 2012-07-24T09:26:33.217 回答