WPF、MVVM和有效的导航/控制流程
本文关键字:导航 控制流 有效 MVVM WPF | 更新日期: 2023-09-27 17:59:28
我目前正在构建一个基于现实世界场景的应用程序,以帮助我学习和理解WPF和MVVM。为此,我阅读并完成了Karl Shifflett的"In The Box"VSIX,我能够将大多数概念适应我正在开发的应用程序
虽然我认为MVVM是一种强大的设计模式,但它确实(似乎)让曾经琐碎的事情(例如显示消息、导航、与多个窗口交互)变得不那么琐碎或简单。现在谈谈我问题的症结/困惑。
我正在开发的WPF应用程序是一个基于Windows的应用程序,并且我正在根据一组基本需求进行工作:
- 基本登录屏幕
- 成功登录后,关闭登录屏幕并打开实际应用程序
- 模拟典型的程序工作流程(通过单击按钮打开"子"窗口,显示模式窗口等)
- 预成型数据验证/错误处理
- 注销
我习惯于在windows平台上使用MDI应用程序,在该平台上,父窗体上的交互会导致子窗体打开;我知道MDI不是WPF支持的东西,我可以从不同的角度来处理开发。不过,我的UI仍将以与MDI应用程序类似的方式工作:我有我的应用程序布局,当我与该布局交互时,我的应用软件将通过打开窗口、显示消息等方式进行响应。我不清楚(通过MVVM)如何与多个窗口交互,也不清楚MVVM如何扩展到具有多个窗口/视图的大型应用程序。
我并不反对使用类似Prism的东西,但我还没有找到一篇关于Prism如何很好地解决我的特定问题的好文章。非常感谢您的任何帮助、建议、反馈或其他方式!
您尝试过查看nRoute
框架吗?
可以在此处找到链接
实际上有一些关于棱镜的好教程
链路1
链路2(链路1的第二部分)
链路3
对于更直接的forrward应用程序(不是很复杂和模块化),您可以始终创建一个应用程序,该应用程序具有管理子用户控件的主窗口(登录窗口、菜单窗口、其他窗口…)
例如,在窗口中创建一个内容呈现器,并在codebehind:中创建
public partial class ShellWindow: Window
{
public enum PagesTypes { Login, Home }
PagesTypes currentOpenedPage;
LoginUserControl login;
HomeUserControl home;
public WindowController()
{
InitializeComponent();
login = new LoginUserControl ();
login.GoToPage += new LoginUserControl.ChangePageHandler(GoToPage);
GoToPage(PagesTypes.Login);
}
public void GoToPage(PagesTypes page)
{
switch (page)
{
case PagesTypes.Login:
//Close last opened usercontrol,
....
//open new usercontrol
login = new LoginUserControl();
contentpresenter.content = login;
break;
//other pages cases
....
}
currentOpenedPage = page;
}
}
例如,登录用户控制:
public partial class LoginUserControl : UserControl
{
internal delegate void ChangePageHandler(ShellWindow.PagesTypes toPage);
internal event ChangePageHandler GoToPage;
public LoginUserControl()
{...}
//Methods for login
.....
internal void LoginOK()
{
if(this.GoToPage != null)
GoToPage(ShellWindow.PagesTypes.Home);
}
}
您可以使用这种方法来构建一个良好的动态-更改用户控件,模拟不同的窗口。
希望这能给你一些想法。
MVV实际上可以很容易地创建子窗口,尤其是当您决定使用选项卡式界面时。您的外部窗口的视图模型只是有一个ChildWindowViewModel的集合。您只需创建新的视图模型,并要求外部窗口将其添加到其集合中,就可以创建一个新的选项卡,WPF的DataTemplate将负责正确的显示。你必须做一些手脚才能让制表符的"关闭"操作按你想要的方式进行。这有点痛苦,但可行。
如果你真的想做MDI,WPF中没有任何内置的东西(我认为微软现在已经决定它是一个糟糕的UI模式了?),但可能有第三方控件可以支持它。任何好的控件都会镜像这个解决方案,他们的MDI容器控件将绑定到你的子窗口视图模型列表。