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客户端应用程序提供服务