【问题标题】:Silverlight/WP7 - Navigation and events triggering on other pagesSilverlight/WP7 - 在其他页面上触发导航和事件
【发布时间】:2012-01-20 08:13:14
【问题描述】:

我的基本问题是,当我认为旧表单被销毁时,我根据网络活动在我离开的页面上触发了事件。

更多详细信息:我正在编写一个与网络播放器通信的 Windows Phone 应用程序。我的 App 类中有一个通信类的静态实例,因此所有表单都可以共享连接,并且我的所有表单都订阅它并在该表单中处理结果。从主菜单中,您可以选择一种类型的源,它会打开一个文件浏览表单,在您导航时刷新列表框,取消后退按钮并刷新新内容以模拟文件导航,直到您成为根文件夹。该应用程序不知道您是否单击了文件或文件夹,当媒体开始播放时它会收到一条网络消息并观察它,然后导航到“播放”表单。到目前为止,我一直在使用所有 .Navigate,它一直运行良好,直到我在主菜单中添加了另一个分支以获取新源。尽管新源完全不同,但设备发送了许多相同的通用命令,这些命令在当前上下文中只是意味着其他东西。在访问我的文件浏览器表单并转到我的新源之后,来自网络的播放命令(现在意味着其他东西)会导致我从以前的源跳转到旧的“播放”表单,就好像我还在文件浏览器表单,这不是预期的。

所以我尝试了很多东西,现在它可以工作了,但它是消息,我失去了一些功能。目前,我从使用所有.navigates(也在后退按钮覆盖中)更改为尝试使用堆栈和navigation.goback。我在需要时使用 App 中的全局变量传递变量,然后将我的网络侦听器从表单中解开,返回,然后将它们连接到新表单的侦听器中。我认为存在时间问题,因为在某些情况下,我需要在媒体框发生变化时向它发送命令,最终再次触发错误的事件处理程序。我认为最简单的解决方案,如果可能的话,而且我认为它会起作用的方式是,如果每次我从旧表单导航时,它的处理程序等都被破坏了,我根本不必使用堆栈,自己处理所有的后退按钮。

我知道这是一个很长的描述,如果你能做到这一点,我希望它有某种意义。有人对我能做什么有任何建议吗?

顺便说一句,我是一名长期自学成才的 VB 程序员,一直被困在 .net 2.0/winforms 中,我刚刚转向 C#、OOP 和 XAML 来编写我的第一部 Windows Phone应用程序,所以很可能我在做一些愚蠢的事情或忽略了一些明显的事情......

【问题讨论】:

    标签: c# silverlight windows-phone-7 windows-phone-7.1


    【解决方案1】:

    这可能是因为某些东西保留了对表单的引用。最常见的原因是事件处理程序。

    因此,如果您的静态类公开了一个事件,并且您在表单中订阅了该事件,则您必须在表单关闭/导航时取消订阅该事件,否则该表单将保留在内存中......

    如果不是这样,请寻找其他获取对您的表单的引用但不释放它的东西。

    【讨论】:

    • 很高兴听到我在正确的轨道上,我查看了所有内容并做了一个我没有取消订阅活动的地方,所以它没有关闭。我可以看到堆栈在更标准的界面上如何有用,但是使用我的虚拟浏览器可以在堆栈中的任何位置插入播放器,这是一团糟
    【解决方案2】:

    在处理从 UI 发送的命令时,问题很可能是基于糟糕的应用程序架构。

    当您说“发送许多相同的通用命令时,这些命令在当前上下文中只是意味着其他东西。”您很可能会揭示问题的根源。

    作为一种解决方法,您可以定义一个接口,由您的通信类实现。每个表单都有自己的方法,它在通信类实例上调用。

    如果您确实收到了来自电话页面的命令,而该命令不再显示,请不要处理它。

    您可以存储导航历史以始终知道哪个页面是唯一允许向通信类发送命令的页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      • 2013-11-30
      • 1970-01-01
      相关资源
      最近更新 更多