我是靠谱客的博主 阔达自行车,这篇文章主要介绍WPF MVVM从入门到精通7:关闭窗口和打开新窗口,现在分享给大家,希望可以做个参考。

若是登录成功,我们一般会执行的操作是关闭当前窗口,然后打开一个新的窗口。但为了比较理想地实现MVVM,我们被禁止在ViewModel里面访问View的元素。那我们该如何实现上面的功能呢?

首先是打开窗口的功能,我们使用的方法是:

(1)窗口初始化的时候即注册需要访问的新窗口。

(2)ViewModel在需要打开新窗口时,使用注册过的窗口。

我们先定义一个WindowManager类:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System; using System.Collections; using System.Windows; namespace LoginDemo.ViewModel.Common { /// <summary> /// 窗口管理器 /// </summary> public static class WindowManager { private static Hashtable _RegisterWindow = new Hashtable(); public static void Register<T>(string key) { if (!_RegisterWindow.Contains(key)) { _RegisterWindow.Add(key, typeof(T)); } } public static void Register(string key, Type t) { if (!_RegisterWindow.Contains(key)) { _RegisterWindow.Add(key, t); } } public static void Remove(string key) { if (_RegisterWindow.ContainsKey(key)) { _RegisterWindow.Remove(key); } } public static void Show(string key, object VM) { if (_RegisterWindow.ContainsKey(key)) { var win = (Window)Activator.CreateInstance((Type)_RegisterWindow[key]); win.DataContext = VM; win.Show(); } } } }

代码比较简单,就不解释了。然后我们在LoginWindow的构造函数里添加代码,变成如下所示:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using LoginDemo.ViewModel.Common; using LoginDemo.ViewModel.Login; using System.Windows; namespace LoginDemo { /// <summary> /// LoginWindow.xaml 的交互逻辑 /// </summary> public partial class LoginWindow : Window { public LoginWindow() { InitializeComponent(); this.DataContext = new LoginViewModel(); WindowMnager.Regiser<MainWindow>("MainWindow"); } } }

是不是发现这里说好只加一行,现在又加一行代码了?实在没有办法,打开窗口就是要这么做。

然后我们在ViewModel需要打开窗口的地方写下面一行代码:

复制代码
1
2
WindowManage.Show("MainWindow",null);

这样新的窗体就能在ViewModel中被打开了。
我们接下来说关闭窗口。要做到这一功能,我们又要借助System.Windows.Interactivity里面的Behavior。它可以把ViewModel里面的一个属性,关联到View层的一个事件(我们这里当然是要关联Window.Close()).
我们先来定义这个关闭行为:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System.Windows; using System.Windows.Interctivity; namespace LoginDemo.ViewModel.Common { /// <summary> /// 窗口行为 /// </summary> public bool Close { get { return (bool)GetValue(CloseProperty,value); } set { SetValue(CloseProperty,value); } } public static readonly DependencyPropery CloseProperty=DependencyProperty.Register("Close",typeof(bool),typeof(WindowBehvior),new PropertyMetadata(false,OnCloseChanged)); private static void OnCloseChanged(DependencyObject d,DependencyPropertyChangedEventArgs e) { var window = ((WindowBehavior)d).AssociatedObject; var newValue = (bool)e.NewValue; if(newValue) { window.Close(); } } }

然后我们在XAML文件里增加以内容

复制代码
1
2
3
4
<i:Interaction.Behaviors> <c:WindowBehavior Close="{Binding ToClose}" /> </i:InteractionBehaviors>

这样的话,窗口的关闭事件就绑定一了ViewModel里面的ToClose属性了。但是这个属性还没有呢,定义一个:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private bool toClose = false; /// <summary> /// 是否要关闭窗口 /// </summary> public bool ToClose { get { return toClose; } set { toClose = value; if (toClose) { this.RaisePropertyChanged("ToClose"); } } }

如此,只要我们在ViewModel里面执行ToClose=true;,当前窗口就会关闭。这节的内容体现在点击登录按钮上,大体如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private BaseCommand loginClick; /// <summary> /// 登录事件 /// </summary> public BaseCommand LoginClick { get { if(loginClick==null) { loginClick = new BaseCommand(new Action<object>(o=>{ //执行登录逻辑 WindowManager.Show("MainWindow",null); ToClose = true; })); } return loginClick; } }

最后

以上就是阔达自行车最近收集整理的关于WPF MVVM从入门到精通7:关闭窗口和打开新窗口的全部内容,更多相关WPF内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(76)

评论列表共有 0 条评论

立即
投稿
返回
顶部