prism模板项目添加一个登录页面和跳转
总体描述
WPF prism8.1.97 MVVM net6
实现运行项目首先进入登录页,登陆成功关闭窗口并打开mainwindow窗口,登录页是mvvm结构。项目使用prism模板项目建立的。
-项目名
-ViewModels
-LoginViewModel.cs
-MainWindowViewModel.cs
-Views
-LoginView.xaml
-LoginView.xaml.cs
-MainWindow.xaml
-MainWindow.xaml.cs
-App.xaml
-App.xaml.cs
App.xaml.cs
CreateShell改成这样,启动页修改为登录页
protected override Window CreateShell()
{
//return Container.Resolve<MainWindow>();
return Container.Resolve<LoginView>();
}
LoginView.xaml
<Grid>
<Button Command="{Binding LoginCommand}">登录</Button>
</Grid>
LoginViewModel.cs
public class LoginViewModel : BindableBase
{
public event Action LoginSuccess;
public LoginViewModel()
{
LoginCommand = new DelegateCommand(OnLogin);
}
public DelegateCommand LoginCommand { get; private set; }
// 登录命令执行时的方法
private void OnLogin()
{
// 处理登录逻辑,例如验证用户输入等
// 登录成功后触发事件
OnLoginSuccess();
}
private void OnLoginSuccess()
{
// 触发登录成功事件
LoginSuccess?.Invoke();
}
}
在使用MVVM模式时,通常视图模型(ViewModel)主要负责处理与用户界面相关的逻辑,而对于视图切换、窗口管理等非界面逻辑,最好放在与视图无关的类中,以保持视图模型的独立性和可测试性。
Invoke 是委托类型的一个方法,用于调用委托所引用的方法。在 C# 中,事件(Event)本质上是一种特殊类型的委托。当你声明并使用一个事件时,实际上是在创建一个多播委托,可以用于订阅和通知多个方法。
对于事件,Invoke 方法用于触发(调用)事件,通知所有订阅者执行相应的操作。在 C# 6.0 引入的 null 条件运算符 (?.) 中,Invoke 方法可以通过 ?. 来调用,从而在事件为 null 时不引发异常。
LoginView.xaml.cs
public partial class LoginView : Window
{
private readonly IContainerExtension _container;
private readonly IRegionManager _regionManager;
public LoginView(IContainerExtension container, IRegionManager regionManager)
{
InitializeComponent();
_container = container;
_regionManager = regionManager;
var viewmodel = new LoginViewModel();
viewmodel.LoginSuccess += OnLoginSuccess;
DataContext = viewmodel;
}
private void OnLoginSuccess()
{
var mainWindow = _container.Resolve<MainWindow>();
RegionManager.SetRegionManager(mainWindow, _regionManager);
mainWindow.Show();
Close();
}
}
结束
这样就能实现登录后关闭擦混港口然后打开mainwindow窗口了,这样写其实是因为mainwindow我想用区域和模块来规划,左边导航栏右边是内容,但是这样就跟登录页沾了全屏有冲突,而且窗口大小也不一样,上网搜了很多都不太理想,然后在一篇文章看到了写法,少了一些配置,所以补全之后记录一下。