WPF 在MVVM模式下彈出子窗體的方式

主要是經過一個WindowManager管理類,在window後臺代碼中經過WindowManager註冊須要彈出的窗體類型,在ViewModel經過WindowManager的Show方法,顯示出來。git

WindowManager代碼以下:this

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類型的對象上。spa

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,並在對應的命令中彈出子窗體Window1blog

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);
}
相關文章
相關標籤/搜索