如何关闭一个未知的儿童窗口?

时间:2012-07-27 00:35:53

标签: c# silverlight-4.0

我在silverlight应用程序中有一些会话管理代码。作为会话管理的一部分,如果用户闲置时间过长,我会自动将用户注销。当用户再次登录时,在上一个会话中打开的任何ChildWindow仍将打开。所有其他会话数据都会重置,因此ChildWindow实际上是孤立的。任何使用它的尝试都会引发错误。当我注销时如何杀死任何ChildWindows?

如何找到可能存在的子窗口并将其终止以便注销可以正常工作?我的第一个想法是从shell开始查看this.GetVisualDescendants().OfType<ChildWindow>();的行。但是,在测试中,即使我打开了一个子窗口,这也是空的。

该应用程序是使用Prism&amp; amp;的一款超级C#应用程序。 MEF。

修改 - 添加更多细节/其他方式来表达问题:

所以程序流程就像:

  1. 用户登录silverlight应用程序。
  2. 用户在应用中导航并打开ChildWindow。
  3. 用户放弃电脑补充咖啡,最后进行20分钟的对话。
  4. 用户的Silverlight“会话”超时。将丢弃所有特定于用户的信息,并显示登录窗口(另一个ChildWindow)。
  5. 用户返回计算机并看到登录提示,登录。
  6. 用户在出去喝咖啡之前看到他们打开的ChildWindow。
  7. 用户尝试点击ChildWindow中的某些内容并收到错误,因为当他们的“会话”结束时,ChildWindow所有的上下文都被丢弃了。
  8. 我想添加到我的会话超时代码(甚至是登录后代码),找到任何打开的ChildWindow并关闭它,以防止这种情况导致错误。

1 个答案:

答案 0 :(得分:0)

所以,我显然难倒每个人,或者更有可能没有让我的问题足够有趣。

我确实找到了解决这个问题的方法。我为应用程序中的所有子窗口创建了一个自定义基类。在该基类中,ChildWindows在静态列表中注册/取消注册(在Loaded / Unloaded事件处理程序中),可以用来获取对任何活动的ChildWindows的引用。