C# Prism WPF关闭视图并释放自动连线视图模型
简而言之,我想要完成的行为是登录->注销->登录 我的应用程序以登录视图开始。身份验证后,它将关闭并打开MainView:C# Prism WPF关闭视图并释放自动连线视图模型,c#,wpf,prism,C#,Wpf,Prism,简而言之,我想要完成的行为是登录->注销->登录 我的应用程序以登录视图开始。身份验证后,它将关闭并打开MainView: public void Authenticated(){ MainWindow main = new MainWindow(); main.Show(); if (Application.Current.Windows.Count > 1) { Application.Current.Windows[0].Close();
public void Authenticated(){
MainWindow main = new MainWindow();
main.Show();
if (Application.Current.Windows.Count > 1) {
Application.Current.Windows[0].Close();
}
this.CloseAction();
}
CloseAction只是一个动作变量,它从代码隐藏处关闭,如下所示
我的主要组件还包含两个从MainViewModel逻辑推送的视图区域(这两个是用户控件)
在某个时候,如果我需要注销,我会运行该函数
public void Logout(){
Login login = new Login();
login.Show();
if (Application.Current.Windows.Count > 1) {
Application.Current.Windows[0].Close();
}
this.CloseAction();
// _eventAggregator.GetEvent<AppMessageLogout>().Publish();
// _regionManager.Regions.ToList().ForEach((r) => r.RemoveAll());
}
public void注销(){
Login Login=新登录();
login.Show();
如果(Application.Current.Windows.Count>1){
Application.Current.Windows[0].Close();
}
这个.CloseAction();
//_eventAggregator.GetEvent().Publish();
//_regionManager.Regions.ToList().ForEach((r)=>r.RemoveAll());
}
但是当我尝试登录时,我的视图视图模型(usercontrols FileTree和FileDetails)会被调用两次(调试构造函数方法)。
前面注释的行是两次试图解决问题但未成功的尝试:
- 在UserControl中使用带有一次性命令的publish/subscribe命令(由于UserControl中没有
Close()
- 在regionManager中删除所有视图以避免垃圾收集。虽然我想这是没用的,因为我在网上读到,视图的父窗口是主窗口,当它关闭时视图也会关闭
ViewModels在xaml文件中都与Prism自动关联。有什么问题?这没有道理。。。要使视图符合垃圾收集的条件,必须删除这些视图。这些视图不是绑定到主窗口吗?所以当我关闭主视图时,视图也会消失。。。然而问题(对构造函数的双重调用)仍然存在。。。这两行都是失败的尝试而不是解决方案此处没有足够的信息来重现问题。但是看看棱镜导航。不只是向区域注册视图,而是注册视图以进行导航。这应该避免双重调用构造函数。看看这个-
_regionManager.RegisterViewWithRegion("FileTreeRegion", typeof(FileTree));
_regionManager.RegisterViewWithRegion("FileDetailsRegion", typeof(FileDetails));
public void Logout(){
Login login = new Login();
login.Show();
if (Application.Current.Windows.Count > 1) {
Application.Current.Windows[0].Close();
}
this.CloseAction();
// _eventAggregator.GetEvent<AppMessageLogout>().Publish();
// _regionManager.Regions.ToList().ForEach((r) => r.RemoveAll());
}