zoukankan      html  css  js  c++  java
  • 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);
    }
    

      

      

      

  • 相关阅读:
    添加绝对路径的链接
    css-------------控制溢出隐藏 换行用省略号表示
    引入公共头部 脚部
    入口图片放在浏览器正中间,点击之后缩小固定在浏览器一侧
    伪类 统一添加样式
    nav 鼠标移入当前高亮显示,其他消失
    17/9/6 bootstrap.css去掉后引发的样式错乱
    JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
    javascript特效实现——当前时间和倒计时效果
    使用DataTables导出excel表格
  • 原文地址:https://www.cnblogs.com/sntetwt/p/11315709.html
Copyright © 2011-2022 走看看