我在 Silverlight 应用程序中有一些会话管理代码。作为该会话管理的一部分,如果用户空闲时间过长,我会自动将其注销。当用户再次登录时,之前会话中打开的任何 ChildWindow 仍将打开。但是,所有其他会话数据都被重置,因此 ChildWindow 被有效地孤立了。任何尝试使用它都会引发错误。注销时如何杀死任何 ChildWindows?
如何找到可能存在的任何子窗口并将其杀死以便注销可以正常工作?我的第一个想法是this.GetVisualDescendants().OfType<ChildWindow>();
从外壳开始寻找。但是,在测试中,即使我打开了子窗口,它也是空的。
该应用程序是使用 Prism 和 MEF 的 silvelight C# 应用程序。
编辑 - 添加更多细节/另一种表达问题的方式:
所以程序流程是这样的:
- 用户登录到 silverlight 应用程序。
- 用户在应用程序中导航并打开一个 ChildWindow。
- 用户放弃他们的计算机来补充咖啡并结束了 20 分钟的对话。
- 用户的 Silverlight“会话”超时。所有特定于用户的信息都将被丢弃,并显示登录窗口(另一个 ChildWindow)。
- 用户返回计算机并看到登录提示,登录。
- 用户在出去喝咖啡之前看到了他们打开的 ChildWindow。
- 用户尝试单击 ChildWindow 中的某些内容并收到错误,因为 ChildWindow 的所有上下文在他们的“会话”结束时都被丢弃了。
我想在我的会话超时代码(甚至登录后代码)中添加一些可以找到任何打开的 ChildWindow 并关闭它的东西,以防止这种导致错误的情况。