2012-07-27 122 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的引用。