首先,我们使用的是C#,WPF,桌面应用程序(可以是.NET 3.5)。
我需要在应用程序启动时显示登录窗口,如果登录成功,则隐藏登录窗口并显示主应用程序窗口。另外,当主窗口关闭时,应该再次看到登录窗口。如果登录窗口关闭,则应用程序退出。
奖励使其变得更难:当选中“记住用户”选项时,将跳过登录窗口并且用户自动登录,显示主窗口。 (请不要考虑如何存储选项,假设您只知道它并将值设置为变量)。
什么是应用程序起始点(意味着哪个窗口被认为是在app.xaml StartupUri属性中)?
您如何解决架构问题?是使用App_Startup事件并从该点显示一些窗口的最佳方法吗?
你会使用什么类型的App.ShutdownMode?那会怎么样?您可以使用“OneLastWindowClose”,“OnMainWindowClose”或“OnExplicitShutdown”。你有什么选择?为什么?
一般来说,我感兴趣的是“什么叫什么,什么是应用程序'root',什么调用关闭应用程序”。
我已经有一个解决方案可以解决我的问题,但我很感兴趣,如果你们中有人遇到过这个问题,你们是如何解决的?我很乐意分享我的方法,但我不想首先限制你的想法。
感谢您的贡献。
P.S。:我正在使用MVVM框架,这让它变得更加混乱,但重点仍然存在。我也使用Ninject作为IoC,但这个问题当然仍然存在。我没有提到这些信息,以使问题尽可能清楚。我还必须处理异常(在登录期间与服务器或数据库的通信可能失败),并且为了使它真正有趣,我必须显示交互式'splashwindow',指示应用程序的作用(加载,与服务器通信,自动登录)。但是请暂时远离这些要求,我们可以稍后再讨论。
答案 0 :(得分:1)
我会按照我的理解重复你的问题,你可以纠正我错过的地方。另外,我对整个M-V-VM的事情都很陌生,所以请大家多加一些意见。我知道如何学习的最好方法是抛弃我的想法并纠正它们。
你想知道事情 1)逻辑存在于何处以决定在何处显示登录或主窗口 2)使用哪种关机模式 3)什么是应用程序根
1) 我认为显示登录或自动登录的决定是业务逻辑,因此应该存在于M-V-VM框架的模型中。实现该逻辑后,视图可以显示查询模型所需的任何窗口。
我假设您的应用程序有一个App.xaml和App.cs文件,该文件在执行应用程序时运行。您可以在App.cs中覆盖OnStartup,并根据业务逻辑的结果显示所需的窗口(通过使用模型中的某个对象来学习)。
2) 对于关机模型,我可能会使用OnLastWindowClose,但我不知道您的应用程序使用了多少个窗口。我只假设你提到的两个(登录和主要)。
3) 什么是应用程序根?我认为你的模型实际上是应用程序根,因为它包含所有重要的东西(视图是模型的用户界面,视图模型是视图的状态)。因此,当涉及到应用程序的根或本质时,我认为它是模型中的一些对象。
什么叫什么?这一切都取决于你想要完成的事情。通常,我避免让视图模型知道有关视图的任何信息。视图和视图模型都可以知道模型。在某些情况下,您需要将Ninject用作服务管理器,以便将视图注入视图模型(不强制视图模型依赖于视图)。
完全不同的方法是完全避免登录窗口并在主窗口中显示登录方法。您仍然需要一些Model对象来告诉您何时显示登录提示,但您不必担心玩杂耍的窗口。老实说,我可能会走这条路。 WPF为我们提供了许多有趣和性感的方法来完成这项任务。
答案 1 :(得分:0)
Application对象是任何WPF项目的根。你是对的,你可以处理App_Startup事件 - 当然,这取决于你在启动时需要做什么。
根据您是否需要更复杂的导航框架或应用程序将永远限于您所描述的方案,您可以从那里开始多种方式。
我在我正在处理的应用程序中正在做的是创建一个Navigator对象来处理不同窗口和内部窗口之间的导航,然后我只需调用Navigator.Navigate(new MyViewModel(), NavMode.ReplaceWindow);
来关闭之前的“主”窗口(如果any是打开的)并显示一个新的,将内容设置为我的ViewModel的实例。然后使用正确的模板显示ViewModel。我还可以使用NavMode.ReplaceUserControl
替换当前“主”窗口的内容,或NavMode.OpenModalWindow
显示模式对话框。我的ShutdownMode设置为OnLastWindowClose,因为如果我想关闭而不管打开的窗口如何,我总是可以调用App.Shutdown()
。
当然,当你替换windows时,你需要确保在关闭旧窗口之前实例化(不显示,只是实例化)新窗口,以避免应用程序关闭,因为你没有更多的窗口。
你可以做类似的事情,但这只是一个想法,它是专门为我的要求量身定做的。