2012-07-27 66 views
0

我在Silverlight应用程序中有一些会话管理代码。作为会话管理的一部分,如果用户空闲时间过长,我会自动将用户登录。当用户再次登录时,前一个会话中打开的任何ChildWindow仍将被打开。所有其他会话数据都被重置,因此ChildWindow被有效地孤立。任何尝试使用它都会导致错误。我在注销时如何杀死任何ChildWindows?如何关闭未知的子窗口?

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

该应用程序是一个silvelight C#应用程序使用棱镜& MEF。

编辑 - 添加更多的细节/另一种方式表达出该问题:

所以程序流会是这样的:

  1. 用户登录到Silverlight机应用。
  2. 用户在应用程序中浏览并打开一个ChildWindow。
  3. 用户放弃他们的电脑充值咖啡,结束了20分钟的谈话。
  4. 用户的Silverlight“会话”超时。所有用户特定的信息都将被丢弃,并显示登录窗口(另一个ChildWindow)。
  5. 用户返回到计算机并看到登录提示,登录。
  6. 用户看到他们在出去喝咖啡之前打开的ChildWindow。
  7. 用户尝试点击ChildWindow中的某些内容并获取错误,因为ChildWindow在“会话”结束时丢弃了所有上下文。

我想添加到我的会话超时代码(甚至是登录后的代码),找到任何打开的ChildWindow并关闭它,以防止这种情况导致错误。

回答

0

所以,我明显难倒了所有人,或者更可能没有让我的问题变得有趣。

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