Caliburn.Micro 项目文档(翻译):Screens, Conductors and Composition

时间:2014-02-24 16:42:27   收藏:0   阅读:615

原文地址(项目说明文档):[Documentation bubuko.com,布布扣 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%

原文:http://www.cnblogs.com/3Tai/p/3562292.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!