关于prism中几个问题的解释

问题:如果要实现类似QQ的登录效果,一个登录界面,登录成功再显示主窗体,要怎么做?登录窗口作为一个模块加载,登录成功在shell中移除这个登录模块再加载其他模块吗,这样的话,shell中的region也是动态生成了?还是登录界面根本不是在这个shell中,是一个独立的项目?

回答:

    这个问题有很多种解决方案。我的做法是

       a、在BootstrapperDependencyObject 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主要功能是创建ConfigurationModuleEnumeratorDirectoryLookupModuleEnumerator实例,然后得到一个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 commandDelegat Command的区别。

       a、菜单当然可以是一个模块,在我的项目里面,菜单就是一个单独的模块。自定义无效,我估计是this.CommandBindingsthis是你的模块,没有获得焦点,所以就没有响应你的快捷键;你可以在绑定代码时用Application.Current.Windows[0].CommandBindings代替this,这样就可以响应你的快捷键了。

       b、推荐一种做法,可以不用在xaml里面使用如下方法绑定命令 Command="local:CustomCommands.StartProcCommand",这样就可以最大程度的剥离vvm,以提高复用的程序。以下代码在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

转载于:https://www.cnblogs.com/oliverxgwang/archive/2010/04/24/1719071.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值