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); }
"唯有高屋建瓴,方可水到渠成"