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模式下弹出子窗体的方式的主要内容,如果未能解决你的问题,请参考以下文章

delphi7怎么弹出子窗口

WPF实战案例-MVVM模式下在Xaml中弹出窗体

C# WPF MVVM模式下在主窗体显示子窗体并获取结果

C# WPF MVVM模式下在主窗体显示子窗体并获取结果

WPF MVVM 子页面控制主窗体新增tab页面

Wpf MVVM ViewModel怎么控制View呢?