问题:如果要实现类似QQ的登录效果,一个登录界面,登录成功再显示主窗体,要怎么做?登录窗口作为一个模块加载,登录成功在shell中移除这个登录模块再加载其他模块吗,这样的话,shell中的region也是动态生成了?还是登录界面根本不是在这个shell中,是一个独立的项目?
回答:
这个问题有很多种解决方案。我的做法是
a、在Bootstrapper的DependencyObject CreateShell()方法中,将引导程序(登录窗口)Resolve出一个实例来,然后再调用Show方法,这样,用户就可以获得登录窗口。
b、在登录窗口中,可以用cal:RegionManager.RegionName="MainRegion" 这样的占位符,如果用户登录验证获得成功,将Login部分的grdLogin.Visibility = Collapsed;这样用户登录完成后,你的登录界面就消失了。
c、程序的主逻辑可以做成一个模块,内容包括你的菜单系统、网络、业务模块占位符等内容,还是在bootstrapper中的protected override void InitializeModules()方法中,初始化你的主窗体,然后载入到“MainRegion”中,就完成了主界面的加载。
以上就是我的做法,肯定有较优的。
问题:模块初始化 protected override IModuleCatalog GetModuleCatalog()和protected override void InitializeModules()是不是功能相同?他们有什么区别?
回答:
GetModuleCatalog主要功能是创建ConfigurationModuleEnumerator、DirectoryLookupModuleEnumerator实例,然后得到一个EnumeratorCatalogProvider实例,它是要生成模块实例的枚举器。然后调用GetCatalog方法,遍历模块,产生一个Catalog。最后返回产生的模块Catalog,并同时在IOC容器(Unity container)中注册该实例。
你也可以自己重写该方法,生成一个ModuleCatalog 实例,然后使用AddModule方法添加要加入的模块,最后返回该ModuleCatalog实例。
ModuleCatalog实例为模块初始化提供模块之间的依赖关系,位置(远程或者本地)等信息。
在InitializeModules方法中,调用ModuleManager.Run方法,完成模块的初始化。当然,你也可以重写InitializeModules,在里面安排你自己模块初始化过程。
问题:做menu菜单的时候发现一个问题:将菜单作为一个模块注入shell中后,自定义的快捷键无效了,但将菜单写在shell中的话快捷键是有效的(快捷键是按照http://social.microsoft.com/Forums/zh-CN/wpfzhchs/thread/3139ffdc-f4f9-48e0-a849-c9f627fe5cc1上的方式添加的),个人觉的是因为模块化了,该模块的命令就无法路由到最外层的窗口了; 这又有几个问题
1)菜单是否应该作为一个模块?还是在shell中完成?
2)如果是,那模块内的怎样定义快捷键怎么才有效?看了框架自带的command无从下手(网上看到一种全局热键,但我现在不想那样做)
回答: 我想你应该问的是热键的问题吧,请注意一下是否混淆了Routed command和Delegat Command的区别。
a、菜单当然可以是一个模块,在我的项目里面,菜单就是一个单独的模块。自定义无效,我估计是this.CommandBindings的this是你的模块,没有获得焦点,所以就没有响应你的快捷键;你可以在绑定代码时用Application.Current.Windows[0].CommandBindings代替this,这样就可以响应你的快捷键了。
b、推荐一种做法,可以不用在xaml里面使用如下方法绑定命令 Command="local:CustomCommands.StartProcCommand",这样就可以最大程度的剥离v与vm,以提高复用的程序。以下代码在vm中,能够响应任何Ctrl+O的快捷键。
var command = new RoutedCommand("command名称", typeof(菜单模块类));
KeyGesture RCtl=new KeyGesture(Key.O,ModifierKeys.Control);
command.InputGestures.Add(RCtl);
var myCmdBinding = new CommandBinding(command, 响应的方法);
Application.Current.Windows[0].CommandBindings.Add(myCmdBinding);
注意该方法必须在退出模块的时候,使用Application.Current.Windows[0].CommandBindings.Remove去掉绑定,否则会导致资源的占用。
我不知道这种方法是不是你说的全局热键,如果有什么不妥,请给我留言,咱们交流一下。
问题:现在这个框架有没有相关的书?除了RI外有没有其他开源的例子?
回答:目前我没有找到,我主要的资源就是看codeplex上面的论坛帖子。还有就是patterns & practices小组出的指导:Composite Application Guidance for WPF