首页 > 其他 > 详细

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

时间:2014-02-24 16:42:27      阅读:614      评论:0      收藏:0      [点我收藏+]

原文地址(项目说明文档):[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 激活的概念分解为几个接口:  

  • IActivate – 表明实现者需要激活。 这个接口提供了一个 Activate 激活方法,一个 IsActive 属性和一个 Activated 激活事件在发生激活时提交通知。
  • IDeactivate – Indicates that the implementer requires deactivation. This interface has a Deactivate method which takes a bool property indicating whether to close the screen in addition to deactivating it. It also has two events: AttemptingDeactivation, which should be raised before deactivation and Deactivated which should be raised after deactivation.表明实现者需要非激活。 这个接口有一个传递 bool 类型参数的 Deactivate 停用方法,可以定义是要关闭还是只是停用它。它还有两个事件:AttemptingDeactivation停用前通知事件。Deactivated停用后通知事件。
  • IGuardClose – Indicates that the implementer may need to cancel a close operation. It has one method: CanClose. This method is designed with an async pattern, allowing complex logic such as async user interaction to take place while making the close decision. The caller will pass an Action<bool> to the CanClose method. The implementer should call the action when guard logic is complete. Pass true to indicate that the implementer can close, false otherwise.表明实现者可能需要取消关闭操作。 它有一个 CanClose 方法。 该方法设计了一种异步模式,允许复杂的逻辑,如异步用户交互时发生的关闭动作。 调用者将通过传递 Action<bool> 给CanClose方法。 实现者应该在监视到逻辑完成后,调用这个方法。 通过返回的结果,来决定是否可以关闭。

 

除了这些核心生命周期接口,我们有一些其他辅助创建类似的表示层的类: 

  • IHaveDisplayName – 有一个 DisplayName 属性
  • INotifyPropertyChangedEx – 从标准 INotifyPropertyChanged 接口继承而来,并增加额外的行为。 增加了一个 IsNotifying 属性可以用来关闭/更改通知,增加 NotifyOfPropertyChange 方法用于手动调用所有属性更新通知方法,用来刷新所有绑定的对象。
  • IObservableCollection<T> – 由以下几个接口组成: IList<T>, INotifyPropertyChangedEx, INotifyCollectionChanged
  • IChild<T> – 实现元素层次结构的一部分,或者需要一个引用一个所有者。 它有一个 Parent 属性。
  • IViewAware – Implemented by classes which need to be made aware of the view that they are bound to. It has an AttachView method which is called by the framework when it binds the view to the instance. It has a GetView method which the framework calls before creating a view for the instance. This enables caching of complex views or even complex view resolution logic. Finally, it has an event which should be raised when a view is attached to the instance called ViewAttached.这个类一定会注意的视图的实现。 它有一个 AttachView 方法称为框架绑定到视图实例。 它有一个 GetView 方法在框架调用之前创建一个视图实例。 它能缓存复杂的视图,甚至复杂的视图解析逻辑。 最后,它有一个 ViewAttached 事件,当视图连接到实例时会自动通知。

因为某些组合非常普遍,我们提供了一些方便的接口和基类: 

  • PropertyChangedBase——实现INotifyPropertyChangedEx(也就是INotifyPropertyChanged)。 它提供了一个 lambda-based 的 NotifyOfPropertyChange方法,除了标准的字符串机制,还支持强类型的更改通知 。 同时,所有属性改变事件自动整理到UI线程2。(见注释2
  • BindableCollection——实现 IObservableCollection < T > 的标准继承 ObservableCollection < T > 还添加了 INotifyPropertyChangedEx 规定的行为。 同时此类还确保发生在UI线程集合所有属性变化和更改事件。(见注释2
  • IScreen——这个接口由其他几个接口组成:IHaveDisplayName, IActivate, IDeactivate,IGuardClose, INotifyPropertyChangedEx
  • Screen——从 PropertyChangedBase 继承和实现 IScreen 接口。 此外还有 IChild 和 IViewAware 实现。

 

这意味着,你可能会从PropertyChangedBase或Screen继承你自己的视图模型。 一般来说,如果你需要任何激活特性和PropertyChangedBase的一切,您将使用Screen。CM默认的 Screen 实现一些附加功能,很容易hook到相应部分的生命周期: 

  • OnInitialize - 可重写,仅在第一次激活 Screen 时执行的逻辑。 初始化完成后,IsInitialized 将为 true。
  • OnActivate—— 可重写,每次 Screen 被激活后要执行的逻辑。 激活完成后, IsActive 将为 true。
  • OnDeactivate—— 可重写,当屏幕以 “deactivated”或“closed”关闭时,应该执行的自定义逻辑。bool 类型的返回值指示该Screen如果还为alive状态,则会返回true
  • CanClose——可重写,默认实现总是允许关闭。 重写这个方法来添加自定义逻辑。
  • OnViewLoaded——因为 Screen 实现 IViewAware,他提供了一个机会让你知道你的视图的 Loaded 加载事件被触发了。 如果你是 SupervisingController 或 PassiveView 风格,需要使用 View 视图,就需要它。 这也是一个可能依赖于一个 view 的,放置 view model 逻辑的地方,即使你可能没有直接使用view。
  • TryClose——调用这个方法关闭Screen。 如果Screen是由 Conductor 控制的,它要求Conductor 启动Screen关闭过程。 如果Screen不是由Conductor 控制,但是独立的(也许它通过 WindowManager 展示),该方法会试图关闭视图。 在这两种场景 CanClose 逻辑将被调用,如果通过,OnDeactivate 将被设为true。

 

要重申:如果你需要一个生命周期,据继承 Screen,否则就继承 PropertyChangedBase。

1.2 Conductors

未完待续。。。完成度 15%

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!