我認爲解決您的問題相當簡單。
簡而言之,您將創建一個ViewModel作爲Shell,並在應用程序啓動時使用登錄窗口表示。如果用戶成功登錄,則此窗口關閉,並且在內容窗口中顯示相同的viewModel實例。如果用戶正在註銷,則會再次顯示登錄窗口。
首先創建一個接口IShell的暴露兩位代表LoginSuccessful
和Logout
public interface IShell
{
Action LoginSuccessful { get; set; }
Action Logout { get; set; }
}
接着創建一個類ShellViewModel
它實現IShell
public class ShellViewModel : Screen, IShell
{
public ShellViewModel()
{
LoginSuccessful = delegate { };
Logout = delegate { };
}
public Action LoginSuccessful { get; set; }
public Action Logout { get; set; }
public void DoLogin()
{
LoginSuccessful();
}
public void DoLogout()
{
Logout();
}
}
方法DoLogin
和DoLogout
是操作其可以是綁定到Button
或任何適合您的控制。
下一步是重寫引導程序中的。此處所包含您所選IoC框架導出的WindowManager
和ShellViewModel
的實例。
protected override void OnStartup(object sender, StartupEventArgs e)
{
var windowManager = IoC.Get<IWindowManager>();
var viewModel = IoC.Get<IShell>();
viewModel.LoginSuccessful =
() => GuardCloseAndReopen("Content");
viewModel.Logout =
() => GuardCloseAndReopen("Login");
windowManager.ShowWindow(viewModel, "Login");
}
private void GuardCloseAndReopen(string shellViewMode)
{
var windowManager = IoC.Get<IWindowManager>();
var shellScreen = IoC.Get<IShell>() as Screen;
Application.ShutdownMode = ShutdownMode.OnExplicitShutdown;
shellScreen.TryClose();
Application.ShutdownMode = ShutdownMode.OnLastWindowClose;
windowManager.ShowWindow(shellScreen, shellViewMode);
}
訣竅是這樣的:如果DoLogout
方法被調用,當前窗口被通過在ShellViewModel
調用TryClose
關閉。同時,通過將Application.ShutdownMode
設置爲OnExplicitShutdown
,可以防止應用程序被關閉。然後使用窗口管理器,通過將「登錄」作爲上下文信息傳遞給windowManager,以登錄模式創建另一個窗口。這實際上是相同的ViewModel,但是,具有不同的視覺表示。
對於Logout
你正在做同樣的事情。
爲了得到這個使用卡利約定的工作,你需要爲這裏看到一個特殊的項目結構(並解釋there):
現在我挑戰你利用這個代碼,並創建一個小示例應用程序。創建Login
視圖(使用按鈕或其他方式進行登錄),並使用LoginSuccessful/Logout方法創建帶有註銷按鈕的Content
視圖。
這將以最少的代碼和類來解決您的問題。希望這會對你有所幫助。
你是WPF還是WinForms?登錄窗口還會執行驗證用戶的實際工作,還是您必須處理「登錄」事件並執行此操作? – Kioshiki 2012-08-20 17:15:23
WPF窗口,它引發了一個登錄事件,我使用從IoC容器獲得的身份驗證服務處理該事件。 – aKzenT 2012-08-20 21:09:43