我认为解决您的问题相当简单。
简而言之,您将创建一个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