Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3,事件和参数Caliburn.Micro 杰的入门教程4,事件聚合器Caliburn.Micro 杰的入门教程5,窗口管理器Caliburn.Micro 杰的入门教程6, Screens 和 Conductors 简介


Caliburn Micro Part 6: Introduction to Screens and Conductors

http://www.mindscapehq.com/blog/index.php/2013/09/11/caliburn-micro-part-6-introduction-to-screens-and-conductors/


So what are these things?(这都是些啥?)

最常见的是,一个screen作为应用程序的一部分是要经过一个生命周期的。它可以被激活,失效或关闭。一个很好的例子就是Visual Studio的代码编辑器。
当用户打开文件进行编辑时,一个代码编辑器被“activated 激活”,当用户切换到一个别的的标签时,它会“deactivated 失效”,如果用户关闭了标签,他就会“closed 关闭”。
当screen的状态改变,就会触发一个event(事件),外部逻辑就可以比如来改变一个基于当前活动screen的工具栏。
到目前为止,screen听起来就像是一种特殊类型的ViewModel视图模型,但这种情况并非总是如此。更深入的想,screen被认为更像是角色,而非视图的模型。其他使用场景就是本系列教程的范围之外了,所以我会使用screen作为视图模型来对待。

Conductors 管理一个或多个Screen的生命周期状态。他们负责基于不同的场景管理Screen的激活,禁用和关闭。
关闭操作的一部分,包括查询Screen,看它是否可以关闭。如果Screen存在未保存的数据,它会停止关闭操作,使未保存的工作不会丢失。

Screens and Conductors in Caliburn Micro

Caliburn Micro 为 screens 和 conductors 提供了很多接口。每个接口都是整个系统里的很精简的一部分,例如提供定制一个非常简单的功能“次Screen可以关闭否”逻辑或指定一个conductor激活一个新Screen时是否要“deactivated 禁用”这个Screen。
如果您创建自己的自定义Screens 或 Conductors,您可以随意的搭配接口,只需要搭配实现你关心的功能。Caliburn Micro也没指望Screens 或 Conductors会实现所有相关的接口,它只需要做你给它的工作。幸运的是, Caliburn Micro还提供了实现这些接口的一些具体的类。这些类可以很容易扩展并重写逻辑,你所期待的我在本教程实现。


首先,我想给这三个conductors 一些说明,Caliburn Micro提供了对于不同的情况的简要说明:

Conductor<T> ——管理一个单一Screen。一旦激活一个新的屏幕,任何先前的Screen会被关闭,会通过 conductor 进行管理。用于非常简单的导航/显示(navigation/display)方案。

Conductor<T>.Collection.OneActive ——管理多个Screen,并允许在同一时间里存在一个激活的Screen,很像一个选项卡控件。当Screen被激活,以前的活动Screen被停用,他不会关闭,也不会通过conductor管理遗留。Screens可以显式地关闭和移除。这种类型的conductor还负责激活Screens中的某一个,如果当前活动Screen关闭。还有简单的逻辑,你可以重写,如果你需要。

Conductor<T>.Collection.AllActive ——和上一个Conductor非常类似,但允许多个屏幕处于活动状态。


所有Caliburn Micro的Conductor实现的一个共同点是,它们扩展Screen类。这意味着Conductor也可以通过它创建了一个非常灵活的模型建立在可组合的比特应用其它导体管理。
现在,你有屏幕和导体的基本认识,什么Caliburn微所提供的,让我们直接以一种非常简单的演示如何使用他们。

Step 1: Getting started

我们直接从入门教程进行修改然后继续本次教程。所以,如果你还没有这样做的话,请通过教程的步骤,只需要几分钟的时间。今天的教程结束应用程序将在窗口的顶部显示三个按钮。点击一个按钮会激活一个conductor,并在按钮区域的下面显示一个Screen。 - 类似Caliburn Micro提供的SimpleNavigation示例。

Step 2: The conductor

现在让我们修改AppViewModel让它变成一个Conductor。我们在一个时间只负责管理一个Screen,所以我们可以使用非常基本的conductor。AppViewModel现在会是这个样子:

public class AppViewModel : Conductor<object>
{ }

需要注意的是,从类的层次上看,其实是Conductor继承了PropertyChangedBase。这样我们就能够改变AppViewModel的继承对象,并且仍然允许它轻松提交属性更改通知,而它是MVVM应用程序的重要组成部分。
还要记住:现在我们在程序的根入口处,添加了一个Conductor,并如上所述,Caliburn Micro的Conductor扩展Screen类。Screens需要Conductor来激活,那么我们的应用程序的根入口是怎么激活的?答案是,Caliburn Micro引导程序(Bootstrapper)和窗口管理类(WindowManager)有用于显示根Screen的支持。所以建立一个Caliburn Micro应用程序时,请确保根 screens/conductors 是被bootstrapper 或 WindowManager 管理的。

Step 3: The screens

现在我们来添加一些 Screens 到我们的应用程序,让conductor来管理。在本教程中,screens 就是视图模型(ViewModel),所以请确保他们的名字用“ViewModel”结尾。在下载的项目里,你会看到我将他们命名为RedViewModel,GreenViewModel和BlueViewModel。他们都扩展Screen类。在本教程中,我们将要保持它们为空类,但我建议能看到一些方法,你可以覆盖和定制自己的行为。
之后为每个Screen添加用户控件 - 记得给他们正确使用Caliburn Micro的命名约定(RedView, GreenView, BlueView).。在每个 View 中,我简单地显示一个彩色的TextBlock如下面的例子:

<UserControl x:Class="CaliburnMicroApp_Navigation.RedView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
<Grid>
<TextBlock Text="Red" FontSize="48" FontWeight="Bold" Foreground="#FF463D" VerticalAlignment="Center" HorizontalAlignment="Center" />
</Grid>
</UserControl>

Step 4: Interactivity(交互)

现在打开 AppView.xaml 文件。在上面加一些按钮:

<DockPanel Width="300" Height="300" Background="LightBlue">
<StackPanel Orientation="Horizontal" DockPanel.Dock="Top" HorizontalAlignment="Center">
<Button x:Name="ShowRedScreen" Content="Red" Width="50" />
<Button x:Name="ShowGreenScreen" Content="Green" Width="50" Margin="12,0,0,0" />
<Button x:Name="ShowBlueScreen" Content="Blue" Width="50" Margin="12,0,0,0" />
</StackPanel>
</DockPanel>

在 AppViewModel.cs 中(我们的conductor),点击一个按钮将激活相应的Screen。这是通过调用ActivateItem方法完成的。下面是AppViewModel.cs的内容(记住,方法的命名要和Button的“name”名称相同,Caliburn Micro会为我们自动添加关联):

public class AppViewModel : Conductor<object>
{
public void ShowRedScreen()
{
ActivateItem(new RedViewModel());
} public void ShowGreenScreen()
{
ActivateItem(new GreenViewModel());
} public void ShowBlueScreen()
{
ActivateItem(new BlueViewModel());
}
}

Step 5: displaying the active screen(显示当前激活Screen)

最后,我们需要显示当前活动的Sceen。这可以通过在按钮加入这个神秘碉堡的一段代码:

<ContentControl x:Name="ActiveItem" />

这是Caliburn Micro的另一个巧妙的命名约定。之前我们已经看到,通过设置控件的名称(name),Caliburn Micro会自动绑定具有和控件有相同名字的ViewModel里的内容。此时,“ActiveItem”是conductor的一个属性,是我们在AppViewModel继承的属性。但此方案的特别之处在于,ContentControl实现显示的是这个属性对应的View,而不是ViewModel。这里再次体现了,我们可以使用Caliburn Micro节省大量的时间。
现在运行应用程序并点击按钮查看conductor做的事情:

这就是Caliburn Micro教程系列的第6部分。我希望它会让您很简单明了的,了解screens 和 conductors并在您的应用程序中使用他们。虽然这是一个简单的演示,然而screens 和 conductors是一个来管理生命周期方案的强大的MVVM的方式,如模式对话框(modal dialogs),导航和动态的标签(navigation and dynamic tabs)。对于其它更多的信息,看看这里的官方文档。这个话题还有很多要看的,但它写得很好。

这里下载本教程完整的Visual Studio解决方案。

Caliburn.Micro 杰的入门教程6, Screens 和 Conductors 简介的更多相关文章

  1. Caliburn.Micro 杰的入门教程5,Window Manager 窗口管理器

    Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...

  2. Caliburn.Micro 杰的入门教程4,事件聚合器

    Caliburn.Micro 杰的入门教程1(原创翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(原创翻译)Caliburn.Micro 杰的入门 ...

  3. Caliburn.Micro 杰的入门教程3,事件和参数

    Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...

  4. Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)

    Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...

  5. Caliburn.Micro 杰的入门教程1(翻译)

    Caliburn.Micro 杰的入门教程1(原创翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程 ...

  6. ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区 1 Desktop简介 1.1 ArcGIS for Desktop ...

  7. Entity Framework入门教程(1)---Entity Framework简介

    什么是Entity Framework 学习EF的前提:熟练使用Linq和Ado.net,因为在使用EF框架进行开发时,我们大多数情况使用Linq进行查询和操作,而EF的底层实现用的是Ado.net. ...

  8. Flutter入门教程(一)Flutter简介

    这是Flutter系列第一篇文章,后续会持续更新Flutter相关知识,本篇就主要对于Flutter技术做一个简单的入门介绍 一.Flutter简介 Flutter是谷歌的移动UI框架,可以快速在iO ...

  9. MongoDB入门教程二[MongoDB Shell 简介与使用]

    MongoDB Shell 是MongoDB自带的JavaScript Shell,随MongoDB一同发布,它是MonoDB客户端工具,可以在Shell中使用命令与MongoDB实例交互,对数据库的 ...

随机推荐

  1. Webpack笔记(三)——一款破产版脚手架的开发

    前些天一直在学习入门Webpack,后来尝试了自己搭建一下一个简单的React开发环境,后来就在想可不可以自己写一个简单的脚手架,以免每次搭建一个简单的开发环境都需要自己一个个的配置,这样很麻烦,使用 ...

  2. Powershell应用

  3. GIS中的空间参考

    GIS一般都是研究的基于地球的某个区域,例如一个国家.省或市的情况,既然地球上都有经纬度来标识,那么直接用经纬度来标识物体的位置不可以吗?但如果应用不一样,在实际中选择的空间参考系也是不一样的.例如我 ...

  4. Spring 通过XML配置装配Bean

    使用XML装配Bean需要定义对于的XML,需要引入对应的XML模式(XSD)文件,这些文件会定义配置Spring Bean的一些元素,简单的配置如下: <?xml version=" ...

  5. PAT——1005. 继续(3n+1)猜想 (25)

    卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对n=3进行验证的时候, ...

  6. 如何清理Macbook垃圾文件

    如何清理Macbook垃圾文件,腾出更多硬盘空间 在Macbook使用久之后,会发现本来还富裕的硬盘,变得越来越少,尤其现在Macbook使用容量很小的固态硬盘.在此种情况下,该如何清理Macbook ...

  7. ejs模版实现递归树形结构渲染

    使用过前端模板的同学们,尤其是使用过nodejs写后台服务的同学们,应该对ejs模板和jade模板都不陌生.对与ejs模板和jade模板孰强孰弱,载各大论坛中一直争论不休,有说ejs更直观的,也有说j ...

  8. 使用 JavaScript 实现名为 flatten(input) 的函数,可以将传入的 input 对象(Object 或者 Array)进行扁平化处理并返回结果

    请使用 JavaScript 实现名为 flatten(input) 的函数,可以将传入的 input 对象(Object 或者 Array)进行扁平化处理并返回结果.具体效果如下: const in ...

  9. sqlplus常用的几种登录方式

    1. sqlplus / as sysdba 操作系统认证,sys管理员登录,/后面要有空格. 2. sqlplus "/ as sysdba" 操作系统认证,sys管理员登录,/ ...

  10. 生产环境MySQL数据库集群MHA上线实施方案

    生产环境MySQL数据库集群MHA上线实施方案 一.不停库操作 1.在所有节点安装MHAnode所需的perl模块(需要有安装epel源) yum install perl-DBD-MySQL -y ...