WPF 介绍一种在MVVM模式下弹出子窗体的方式

匿名 (未验证) 提交于 2019-12-02 22:06:11

主要是通过一个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 WindowExt     {         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);         }     }

添加一个ViewModelBase,并在类中添加ShowDialog方法,这样所有继承的ViewModel都有这个方法

    public class ViewModelBase     {         public void ShowDialog(string key,object vm)         {             WindowManager.ShowDialog(key,vm);         }          public void ShowMessage(string mes,string title="",MessageBoxButton buttons= MessageBoxButton.OK)         {             MessageBox.Show(mes,title,buttons);         }     }

添加一个窗体,并注册子窗体,this.Register<Window1>("Window1");

 public partial class MainWindow : Window     {         public MainWindow()         {             InitializeComponent();             this.DataContext = new MainWindowViewModel();             this.Register<Window1>("Window1");         }     }

添加ViewModel,继承自ViewModelBase,并在对应的命令中弹出子窗体Window1

    public class MainWindowViewModel:ViewModelBase     {         public MainWindowViewModel()         {             BtnCommand = new DelegateCommand(ExecuteBtn);         }          public DelegateCommand BtnCommand { get; set; }           private void ExecuteBtn()         {             ShowDialog("Window1",this);         }      }

这样子窗体就弹出来了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!