0

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

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

该应用程序是使用 Prism 和 MEF 的 silvelight C# 应用程序。

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

所以程序流程是这样的:

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

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

4

1 回答 1

0

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

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

于 2012-08-30T20:30:14.983 回答