WPF 在MVVM模式下弹出子窗体的方式
Posted sntetwt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF 在MVVM模式下弹出子窗体的方式相关的知识,希望对你有一定的参考价值。
主要是通过一个WindowManager管理类,在window后台代码中通过WindowManager注册需要弹出的窗体类型,在ViewModel通过WindowManager的Show方法,显示出来。
WindowManager代码如下:
public static class WindowManager private static Hashtable _RegisterWindow = new Hashtable(); public static void Regiter<T>(string key) _RegisterWindow.Add(key, typeof(T)); public static void Regiter(string key, Type t) if (!_RegisterWindow.ContainsKey(key)) _RegisterWindow.Add(key, t); public static void Remove(string key) if (_RegisterWindow.ContainsKey(key)) _RegisterWindow.Remove(key); public static void ShowDialog(string key, object VM) if (!_RegisterWindow.ContainsKey(key)) throw (new Exception("没有注册此键!")); var win = (Window)Activator.CreateInstance((Type)_RegisterWindow[key]); win.DataContext = VM; win.ShowDialog();
做一个扩展方法,将子窗体注册方法扩展到Window类型的对象上。
public static class WindowRegister public static void Register(this Window win, string key) WindowManager.Regiter(key, win.GetType()); public static void Register(this Window win,string key,Type t) WindowManager.Regiter(key,t); public static void Register<T>(this Window win, string key) WindowManager.Regiter<T>(key);
添加一个窗体,并注册子窗体, this.Register<Window1>("Window1");
public partial class MainWindow : Window public MainWindow() InitializeComponent(); this.DataContext = new MainWindowViewModel(); this.Register<Window1>("Effects");
添加ViewModel,继承自ViewModelBase,并在对应的命令中弹出子窗体Window1
private DelegateCommand<Window> _effectCommand = null; public DelegateCommand<Window> EffectCommand set _effectCommand = value; get if (_effectCommand == null) _effectCommand = new DelegateCommand<Window>(Effect); return _effectCommand; void Effect(Window window) WindowManager.ShowDialog("Effects", this);
以上是关于WPF 在MVVM模式下弹出子窗体的方式的主要内容,如果未能解决你的问题,请参考以下文章