我的基本问题是,我在基于网络活动而离开的网页上发生了一些事件,这些事件在我认为旧表单被销毁时会导致问题。
更详细的信息:我正在编写一个与网络播放器通信的Windows Phone应用程序。我的App类中有一个静态的通信类实例,所以所有表单都可以共享连接,所有表单都订阅它并处理该表单中的结果。从主菜单中,您可以选择一种类型的源,它会打开一个文件浏览表单,在您导航时刷新列表框,取消后退按钮并刷新新内容以模拟文件导航,直到您成为根文件夹。该应用程序不知道您是否点击了某个文件或文件夹,它会在媒体开始播放时收到一条网络消息并观看该消息,然后导航到播放"形成。到目前为止,我一直在使用所有.Navigate,并且它工作得很好,直到我在主菜单上添加了另一个分支以获得新的来源。虽然新源完全不同,但设备会发送许多相同的通用命令,这些命令只是在当前上下文中表示其他内容。在访问我的文件浏览器表单并转到我的新来源后,来自网络的播放命令,这意味着现在的其他内容,将导致我跳入我的旧游戏"来自上一个来源的表单,好像我仍然在文件浏览器表单上,这不是预期的。
所以我尝试了很多东西并且现在有点工作,但它的消息却让我失去了一些功能。目前我从使用所有.navigates(也在后退按钮覆盖中)改为尝试使用堆栈和navigate.goback。我在需要时使用全局变量在App中传递变量,并从表单中取出我的网络侦听器,goback,然后将它们连接到新形式的侦听器中。 navigatedto。我认为存在计时问题,因为在某些情况下我需要将命令发送到媒体盒,因为它正在改变并最终再次触发错误的事件处理程序。我认为最简单的解决方案,如果可能的话,我认为它会起作用,如果每次我从旧的形式导航,它的处理程序等都被破坏了,我没有必要完全使用堆栈,自己处理所有后退按钮。
我知道这是一个很长的描述,谢谢你,如果你做到这一点,希望它有一些道理。有没有人对我能做什么有任何建议?
作为旁注,我很长一段时间都是自学成才的VB程序员,他一直被困在.net 2.0 / winforms中,我刚刚转向C#,OOP和XAML写我的第一个Windows Phone应用程序,所以我可能会做一些愚蠢的事情或忽视一些明显的东西...
答案 0 :(得分:0)
可能是因为某些内容保留了对表单的引用。最常见的原因是事件处理程序。
因此,如果您的静态类公开某个事件,并且您在表单中订阅该事件,则必须在表单关闭/导航时取消订阅该事件,否则该表单将保留在内存中....
如果不是这种情况,请查找获取对表单的引用但不发布的其他内容。
答案 1 :(得分:0)
当涉及处理从UI发送的命令时,问题很可能是基于糟糕的应用程序架构。
当你说'发送许多相同的通用命令时,这些命令只是在当前上下文中表示其他内容。'你最有可能揭示问题的根源。
作为一种变通方法,您可以定义通信类实现的接口。每个表单都有自己在通信类实例上调用的方法。
如果您确实收到来自电话页面的命令,但该视频已不在视图中,请不要进行处理。
您可以存储导航历史记录,以便始终知道哪个页面是唯一允许向通信类发送命令的页面。