主要是通过一个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模式下弹出子窗体的方式的更多相关文章

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

    主要是通过一个WindowManager管理类,在window后台代码中通过WindowManager注册需要弹出的窗体类型,在ViewModel通过WindowManager的Show方法,显示出来 ...

  2. MVVM模式下弹出窗体

    原地址:http://www.cnblogs.com/yk250/p/5773425.html 在mvvm模式下弹出窗体,有使用接口模式传入参数new一个对象的,还有的是继承于一个window,然后在 ...

  3. DevExpress第三方控件使用实例之ASPxPopupControl弹出子窗体

    弹出页面控件:ASPxPopupControl, <dxpc:ASPxPopupControl ID="popubCtr" runat="server" ...

  4. [Prism框架实用分享]如何在主程序中合理的弹出子窗体

    大家好 说起子窗体,大家都会想到ChildWindow,多熟悉的一个控件.不错,Sliverlight中已经提供了子窗体的具体实现,而在WPF中却没有这么好的事情(有的第三方控件商已经提供此控件).最 ...

  5. Prism框架 如何在主程序中合理的弹出子窗体

    说起子窗体,大家都会想到ChildWindow,多熟悉的一个控件.不错,Sliverlight中已经提供了子窗体的具体实现,而在WPF中却没有这么好的事情(有的第三方控件商已经提供此控件).最常见的实 ...

  6. WPF 利用子线程弹出子窗体的研究

    一般来说子线程都是用来处理数据的,主窗体用来实现展现,但是有些时候我们希望子窗体实现等待效果,遮挡主窗体并使主窗体逻辑正常进行,这个业务需求虽然不多,但是正好我们用到了,于是我打算把研究成果写在这了. ...

  7. 笔记03 wpf 在MVVM模式下怎样在Viewmodel里面获得view的控件对象

     转自http://blog.csdn.net/qing2005/article/details/6601199http://blog.csdn.net/qing2005/article/detail ...

  8. WPF中MVVM模式下控件自有的事件绑定

    1.原因 在WPF中单纯的命令绑定往往不能满足覆盖所有的事件,例如ComboBox的SelectionChanged事件,DataGrid的SelectionChanged事件等等,这时就可以用事件绑 ...

  9. WPF:MVVM模式下ViewModel关闭View

    不外乎两种基本方法. 消息通知和参数传递. 一.消息通知 利用View里的IsEnable属性 原理是这样的: 1.UI中的IsEnabled绑定VM中的属性 2.UI的后台代码中,注册IsEnabl ...

随机推荐

  1. 为什么内核访问用户数据之前,要做access_ok?

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 原理 先看一段小视频,如果内核访问用户 ...

  2. 【JavaScript】案例二:使用JS完成首页轮播图效果——事件(onclick&onload)

    1.切换图片例子: 事件(onclick) <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...

  3. ubuntu 1804安装详解

    我这边安装的是ubuntu server版本,大家安装时可以参考我这篇文件进行安装. 1.选择安装语言: 这里选择默认的"English"和“中文(简体)”都可以. 2.选择”安装 ...

  4. LOJ 2249: 洛谷 P2305: bzoj 3672: 「NOI2014」购票

    题目传送门:LOJ #2249. 题意简述: 有一棵以 \(1\) 号节点为根节点的带边权的树. 除了 \(1\) 号节点的所有节点上都有人需要坐车到达 \(1\) 号节点. 除了 \(1\) 号节点 ...

  5. python 操作目录

    每天写一点,总有一天我这条咸鱼能变得更咸 python 中对文件及目录的操作基本依赖与os,shutil模块,其中以os模块为主,最主要的几个方法实例如下: 1.判断文件/目录是否存在(os.path ...

  6. 数组问题:a与&a有的区别

    int a[5] = {0,1,2,3,4};这种用法还是比较常见的. #include <stdio.h> int main(void) { int a[5] = {0,1,2,3,4} ...

  7. 利用easyui的行编辑自动增加一行来进行增删有详细注解

    jQuery EasyUI 框架提供了创建网页所需的一切,帮助您轻松建立站点. easyui 是一个基于 jQuery 的框架,集成了各种用户界面插件. easyui 提供建立现代化的具有交互性的 j ...

  8. twisted框架的使用和应用?

    https://www.cnblogs.com/zhiyong-ITNote/archive/2017/08/14/7360442.html twisted网络框架的三个基础模块:Protocol, ...

  9. 引入jquery时,页面一直加载

    注意jquery的引用位置最好放在<head>下面.

  10. pyhton2 and python3 生成随机数字、字母、符号字典(用于撞库测试/验证码等)

    本文介绍Python3中String模块ascii_letters和digits方法,其中ascii_letters是生成所有字母,从a-z和A-Z,digits是生成所有数字0-9.string.p ...