原文地址(项目说明文档):[Documentation Screens,
Conductors and Composition]
http://caliburnmicro.codeplex.com/wikipage?title=Screens%2c%20Conductors%20and%20Composition&referringTitle=Documentation
Actions, Coroutines 和 Conventions 是在 Caliburn.Micro 中很值得关注的, 但是 Screens 和 Conductors 更需要深入了解,如果你的 UI 需要进行良好的设计. 他是非常重要的一个利器。Screen, Screen Conductor 和 Screen Collection 这三个术语,Jeremy Miller 先生也多次在 "Presentation Patterns" for Addison Wesley 书籍中的到过。 而这些模式在CM中是通过从特定的基类继承ViewModel实现的,最好理解它们为“角色(Roles)”,而不是普通的 View-Models。实际上根据你不同的架构,一个 Screen 可能是一个 UserControl, Presenter 或 ViewModel。有点儿跑题了, 我们先看一下它们是什么吧。
1.Screen
最简单易懂的说。你可能会认为它是一个在应用程序中有状态的表示层单元。它独立于应用程序shell。这种shell 可以显示许多不同的screens,一些事件在某个时间可能会有不同的几个screens,它可以显示大量的小部件,但不是screens的某部分。一些 screen 实例还可能是用于程序设置的“模态对话框”。Visual Studio 中的 代码编辑器窗口,或一个浏览器页。读到这里,你可能稍微有些理解。
通常一个Screen有一个与之关联的生命周期,允许执行自定义的屏幕
激活/失效( activation/deactivation) 的逻辑。Jeremy
先生称之为ScreenActivator。 以Visual
Studio代码编辑器窗口举例。我在其中一个编辑器窗口写代码,之后我切换到了另一个选项卡编辑xml文件,此时要注意工具栏图标会发生改变。
每一个Screen都有自定义的
激活/失效 的逻辑,使它能够 设置/卸载
应用程序工具栏等。这样就能基于活动的screen为程序提供图标。普通形况下,ScreenActivator 就是一个 Screen 类。
但是要记住它们是不同的角色。如果一个特定的 screen 有复杂的激活逻辑,为了减少复杂度,ScreenActivator
就是这个类中必要的因素了。如果你的程序有不同的Screen但有相同的 激活/失效 逻辑,这是很重要的一点。
2.Screen Conductor
只要你的应用程序引入了
Screen
激活生命周期的概念。就需要执行某种方法,他就是ScreenConductor角色。
当显示一个
screen时,conductor 会确认它的激活状态。如果要离开一个 screen,它就可以实现停用功能。
同样,Screen
的 激活/失效 可能要实现一个接口或多个接口,允许 Conductor 问它“你能关闭吗?”。这就引出了一个重要的观点:在某些情况下关闭
Screen 和别的Screen 可能是相同的,也可能是不同的,这里就不一样了。比如:在Visual
Studio中,从一个选项卡切换到另一个选项卡中,只是 激活/非激活
这两个情况,还要显示定义关闭选项卡逻辑,来完成触发器逻辑。
然而,在基于导航(navigation)的应用程序中,跳转导航肯定会非激活页面,但也可能导致页面关闭。
这一切都取决于您的特定应用程序的体系结构,你应该仔细考虑这些情况。
3.Screen Collection
像Visual Studio这样的应用程序,不仅会有一个ScreenConductor管理 激活/非激活 等等。也会有 ScreenCollection 维持当前打开的 Screens 或 Documents 的列表。 就像堆积木一样,我们也可以解决 非激活/关闭 的问题。 所有ScreenCollection都是开放的,但只有其中一个项目是活跃的。 MDI-style风格的应用程序(如VS,,Conductor 会管理 ScreenCollection 成员中的 Screen 的切换。 打开一个新 Document 会将它添加到 ScreenCollection 并切换到活跃的 Screen。 关闭文档不仅会关闭它,还会从 ScreenCollection 中删除它。 这一切取决于是否去积极响应“要关闭它么?”事件。 当然,文件关闭后,Conductor 还需要决定ScreenCollection中的那些物件会成为下一个活动项。
二、实现:
ScreenCollection could be a custom collection with special logic for maintaining the active screen, or it could just be a simple IList<IScreen>.
有很多不同的实现方式。
你可以继承一个TabControl,实现一个IScreenConductor接口直接构建所有的逻辑的控件。 然后添加到您的IoC容器中,完成并运行。
也可以让你的 UserControl(自定控件) 实现一个 IScreen 接口或者你可以实现它作为POCO让 “监视控制器” 继承。
ScreenCollection可以是包含维护 Screen 活动状态,一些特殊逻辑的自定义集合,或者它可能只是一个简单的 IList
< IScreen >。
1.Caliburn.Micro 实现
These concepts are implemented in CM through various interfaces and base classes which can be used mostly1to build ViewModels. Let’s take a look at them:
通过CM中各种接口和基类实现,可以使用 mostly1to 建立 ViewModels。 让我们看一看: 见注释1
1.1 Screens
In Caliburn.Micro we have broken down the notion of screen activation into several interfaces:
在Caliburn.Micro。 我们将 screen 激活的概念分解为几个接口:
除了这些核心生命周期接口,我们有一些其他辅助创建类似的表示层的类:
因为某些组合非常普遍,我们提供了一些方便的接口和基类:
这意味着,你可能会从PropertyChangedBase或Screen继承你自己的视图模型。 一般来说,如果你需要任何激活特性和PropertyChangedBase的一切,您将使用Screen。CM默认的 Screen 实现一些附加功能,很容易hook到相应部分的生命周期:
要重申:如果你需要一个生命周期,据继承 Screen,否则就继承 PropertyChangedBase。
1.2 Conductors
未完待续。。。完成度 15%
Caliburn.Micro 项目文档(翻译):Screens, Conductors and Composition
原文:http://www.cnblogs.com/3Tai/p/3562292.html