0

首先,我们在C#、WPF、桌面应用(可以是.NET 3.5)。

我需要在应用程序启动时显示登录窗口,如果登录成功,隐藏登录窗口并显示主应用程序窗口。此外,当主窗口关闭时,应该会再次看到登录窗口。如果登录窗口关闭,应用程序将退出。

更难的奖励:当“记住用户”选项被选中时,登录窗口被跳过,用户自动登录,直接显示主窗口。(请不要考虑选项是如何存储的,假设您只知道它并且在变量中有值)。

什么是应用程序起点(意味着哪个窗口被认为在 app.xaml StartupUri 属性中)?

你将如何解决架构问题?使用 App_Startup 事件并从那时起显示一些窗口的最佳方式是什么?

你会使用什么类型的 App.ShutdownMode?那将如何运作?您可以使用“OneLastWindowClose”、“OnMainWindowClose”或“OnExplicitShutdown”。你的选择是什么,为什么?

一般来说,我对“什么叫什么,什么是应用程序'root',什么调用关闭应用程序”感兴趣。

我已经为我的问题找到了可行的解决方案,但我很感兴趣,如果你们中的任何人遇到过这个问题,你们是如何解决的?我很乐意分享我的方法,但我不想首先限制你的想法。

感谢您的贡献。

PS:我正在使用 MVVM 框架,这使它有点混乱,但重点仍然存在。我也使用 Ninject 作为 IoC,但这个问题当然仍然存在。我没有提到这些信息是为了使问题尽可能清楚。我还必须处理异常(登录期间与服务器或数据库的通信可能会失败),并且为了让它真正有趣,我必须显示交互式“启动窗口”,指示应用程序的功能(加载、与服务器通信、自动登录)。但请暂时远离这些要求,我们稍后再讨论。

4

2 回答 2

1

我将按照我的理解重复您的问题,您可以在我遗漏的地方纠正我。另外,我对整个 MV-VM 的事情还很陌生,所以请接受我的建议。我知道如何学习的最好方法是扔掉我的想法并纠正它们。

你想知道的事情 1) 逻辑应该存在于哪里来决定在哪里显示登录或主窗口 2) 使用哪种关闭模式 3) 什么是应用程序根

1)我相信显示登录或自动登录的决定是业务逻辑,因此应该存在于您的 MV-VM 框架的模型中。一旦实现了该逻辑,视图就可以通过查询模型来显示所需的任何窗口。

我假设您的应用程序有一个 App.xaml 和 App.cs 文件,该文件在应用程序执行时运行。您可以在 App.cs 中覆盖 OnStartup 并根据业务逻辑的结果(通过使用模型中的某些对象来学习)显示任何必要的窗口。

2) 对于关机模式,我可能会选择 OnLastWindowClose,但我不知道您的应用程序正在使用多少个窗口。我假设只有你提到的两个(登录和主)。

3)什么是应用程序根?我认为您的模型实际上是应用程序的根,因为它包含所有重要的东西(视图是模型的用户界面,视图模型是视图的状态)。因此,当谈到应用程序的根或本质时,我认为它是模型中的一组对象。

什么叫什么?这完全取决于您要完成的工作。一般来说,我避免让视图模型知道关于视图的任何信息。视图和视图模型都可以知道模型。在某些情况下,您需要使用 Ninject 作为服务管理器,以便将视图注入视图模型(而不强制视图模型依赖于视图)。


一种完全不同的方法是完全避免登录窗口并在主窗口中显示登录方法。您仍然需要一些 Model 对象来告诉您何时显示登录提示,但您不必担心杂耍窗口。老实说,我可能会走那条路。WPF 为我们提供了许多有趣和性感的方式来完成这项任务。

于 2010-09-16T13:10:29.057 回答
0

Application 对象是任何 WPF 项目的根。您可以处理 App_Startup 事件是正确的 - 当然,这取决于您在启动时需要做什么。

根据您是否需要更复杂的导航框架或应用程序将永远受限于您描述的场景,您可以从那里采取多种方式。

我在我处理的应用程序中所做的是创建一个导航器对象,它处理不同窗口之间和内部窗口之间的导航,然后我只需调用Navigator.Navigate(new MyViewModel(), NavMode.ReplaceWindow);它关闭以前的“主”窗口(如果有的话)并显示一个新的一、将内容设置为我的ViewModel的实例。然后使用正确的模板显示 ViewModel。我还可以使用NavMode.ReplaceUserControl它替换当前“主”窗口的内容,或者NavMode.OpenModalWindow显示一个模式对话框。App.Shutdown()我的 ShutdownMode 设置为 OnLastWindowClose,因为无论打开的窗口如何,如果我想关闭,我总是可以调用。

当然,当您更换窗口时,您需要确保在关闭旧窗口之前实例化(不显示,只是实例化)新窗口,以避免应用程序因为没有更多窗口而关闭。

你可以做类似的事情,但这只是一个想法,它是专门为我的要求量身定制的。

于 2010-09-16T13:11:23.667 回答