UWP - DataPackage.OperationCompleted 为 EMPTY 并被无人调用

Posted

技术标签:

【中文标题】UWP - DataPackage.OperationCompleted 为 EMPTY 并被无人调用【英文标题】:UWP - DataPackage.OperationCompleted is EMPTY & gets called by nobody 【发布时间】:2017-07-24 16:24:33 【问题描述】:

我正在编写 UWP 文件管理器,但遇到了拖放问题。我可能只是在碰壁,因为这显然是平台中的另一个错误,但这次我找不到任何解决方法。

将文件拖放到文件资源管理器中时,一切都很好。我填写了DataPackage 并收听OperationCompleted 事件,该事件发生在文件完成移动到另一个文件夹时。当我将它们放到我的应用程序中的另一个视图中时,我可以调用DataPackageView.ReportOperationCompleted,它确实有效(有点)。问题是,它在下降发生的同时也被自动调用,即使操作还没有完成——我对此无能为力。当我在事件处理程序中遇到断点时,调用堆栈完全为空。

最重要的是,当我真正查看OperationCompleted 的参数时,OperationCompletedEventArgs 中的Operation 总是无!文件资源管理器完成工作时为无,自动调用时为无,手动调用时为无,无论我传入什么参数。对此有何解释,微软?我已经厌倦了修复你的错误,尤其是当我实际上无法做到时,因为平台非常有限。

【问题讨论】:

如果您只想在 UWP 中拖放文件。看来你不需要调用DataPackageView.ReportOperationCompleted事件,见http://jamescroft.co.uk/blog/uwp/implementing-file-drag-drop-in-your-windows-10-uwp-application/ 不,我没有,你是对的,这已经有效,但我想要一个关于何时实际完成操作的通知。即使我实际上并不需要它,这绝对应该可以工作,因为其他程序可以依赖它。 顺便说一句,在 UWP 中拖放文件的另一个“好奇心”是,如果您将文件拖放到应用程序中并且请求的操作设置为移动 - 您实际上无法移动它们 - 文件是只读的。尝试向用户解释。 【参考方案1】:

在 UWP 中拖放文件的另一个“好奇心”是,如果您将文件拖放到应用程序中并且请求的操作设置为移动 - 您实际上无法移动它们 - 文件是只读的。尝试向用户解释。

不确定如何移动文件。一般来说,你应该使用StorageFile.CopyAsync 方法。您可以使用try/catch 块来包装此操作,如下所示:

try

     var operation = appFile.File.CopyAsync(ApplicationData.Current.LocalFolder, appFile.File.DisplayName, NameCollisionOption.GenerateUniqueName);


catch (Exception ex)

     System.Diagnostics.Debug.WriteLine("exception msg: "+ex.Message);

如果文件是只读的,你会得到异常消息,你应该用这个消息通知用户。

我想要在操作实际完成时收到通知。

你应该为你的异步操作实现 AsyncOperationWithProgressCompletedHandler,然后你会在它完成时收到通知。

operation.Completed = (tresult,tprogress) =>  System.Diagnostics.Debug.WriteLine("progress msg: "+tprogress); ;

【讨论】:

是的,CopyAsync 可以工作,但 MoveAsync 会引发异常。这些文件是只读的 - 即使用户将它们放入我的应用程序中,我也无法访问它们。我收到了一个请求的移动操作 - 没有办法移动它们。 感谢您的帮助,但这不是我的意思。我当然知道我正在做的事情什么时候完成。那不是重点。任何应用程序都可以将文件放入我的应用程序,而不仅仅是我自己的。您必须将其报告给源应用程序 - 这就是 API 的重点。

以上是关于UWP - DataPackage.OperationCompleted 为 EMPTY 并被无人调用的主要内容,如果未能解决你的问题,请参考以下文章

2019-11-25-加强版在国内分发-UWP-应用正确方式-通过win32安装UWP应用

为啥必须在 UWP 中使用 StreamSocketListener 而不是 TcpListener,尽管 UWP 是 .NET Core 的子集,而 TcpListener 在 UWP 中可用?

UWP使用AppService向另一个UWP客户端应用程序提供服务

[UWP]涨姿势UWP源码——IsolatedStorage

win10 uwp 如何开始写 uwp 程序

起调UWP的几种方法