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. January 14 2017 Week 2nd Saturday

    Don't try so hard, the best things come when you least expect them to. 不要着急,最好的总会在最不经意时出现. The secon ...

  2. 如何在SAP里创建configurable material物料主数据

    (1) 使用tcode CT04创建characteristic: assign 所有可能的color value: (2) 使用tcode CL02创建class. 类型选择300- variant ...

  3. Linux硬盘扩容

    1.安装gparted分区工具 2.从虚拟机设置新的虚拟硬盘 3.挂载分区 sudo mount -t ext4 /dev/sdb1 /home/zhoushuo/zsdf -hsudo chmod ...

  4. 一.在Linux中for和cat遍历文件内容出现no space

    以前使用for var in file方式逐行读取文件内容的时候,都没有出现问题,但是今天使用如下代码,会出现“no space” ,目标数据文件内容为6.8M, # 写入临时文件,第一行不能写入 f ...

  5. 关于webstorm打开项目,文件下方出现了一个小锁的图标,修改文件出现“cannot modify a ready-only directory”的弹窗提示

    今天用webstorm打开项目,文件下方出现了一个小锁的图标,修改文件出现“cannot modify a ready-only directory”的弹窗提示 解决办法:运行 sudo chown ...

  6. 设计模式——Spirng_Bean工厂

    前言:对于简单工厂和抽象工厂都有自己的优点和缺点, 比如简单工厂,如果你需要实现的类过多,你最后会出现工厂泛滥的情况,没有有效的控制代码的可重复性.http://www.cnblogs.com/xia ...

  7. ARM v8-A 系列CPU的MMU隐射分析

    ARM v8-A 系列CPU的MMU隐射分析 摘要:V8-A系列CPU有ELX,X为0~3等4个异常级别,又有AArch64和AArch32两种执行状态,异常级别可以决定执行状态,而对应着执行状态,M ...

  8. EF Core中如何通过实体集合属性删除从表的数据

    假设在数据库中有两个表:Person表和Book表,Person和Book是一对多关系 Person表数据: Book表数据: 可以看到数据库Book表中所有的数据都属于Person表中"F ...

  9. .net 网站中如何动态播放音乐,页面如何播放音乐

    向别人请教有好处也有坏处,好处是你可以相对比较快的知道要点,坏处就是你TM的发现你弄了那么久都是白弄. 昨天今天一直在找一个问题的解决方案,我的问题描述大概是这样子的:我用vs2012开发的.net网 ...

  10. 撸一个简单的MVVM例子

    我个人以为mvvm框架里面最重要的一点就是VM这部分,它要与Model层建立联系,将Model层转换成可以被View层识别的数据结构:其次也要同View建立联系,将数据及时更新到View层上,并且响应 ...