Caliburn.Micro 杰的入门教程6, Screens 和 Conductors 简介
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
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 简介的更多相关文章
- Caliburn.Micro 杰的入门教程5,Window Manager 窗口管理器
Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...
- Caliburn.Micro 杰的入门教程4,事件聚合器
Caliburn.Micro 杰的入门教程1(原创翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(原创翻译)Caliburn.Micro 杰的入门 ...
- Caliburn.Micro 杰的入门教程3,事件和参数
Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...
- Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)
Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...
- Caliburn.Micro 杰的入门教程1(翻译)
Caliburn.Micro 杰的入门教程1(原创翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程 ...
- ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区 1 Desktop简介 1.1 ArcGIS for Desktop ...
- Entity Framework入门教程(1)---Entity Framework简介
什么是Entity Framework 学习EF的前提:熟练使用Linq和Ado.net,因为在使用EF框架进行开发时,我们大多数情况使用Linq进行查询和操作,而EF的底层实现用的是Ado.net. ...
- Flutter入门教程(一)Flutter简介
这是Flutter系列第一篇文章,后续会持续更新Flutter相关知识,本篇就主要对于Flutter技术做一个简单的入门介绍 一.Flutter简介 Flutter是谷歌的移动UI框架,可以快速在iO ...
- MongoDB入门教程二[MongoDB Shell 简介与使用]
MongoDB Shell 是MongoDB自带的JavaScript Shell,随MongoDB一同发布,它是MonoDB客户端工具,可以在Shell中使用命令与MongoDB实例交互,对数据库的 ...
随机推荐
- [转]ubuntu下整合eclipse和javah生成jni头文件开发android的native程序
转载自:http://blog.csdn.net/jiuyueguang/article/details/9404237 本文介绍两种利用javah命令生成jni头文件的方法,第一种为大众所知的jav ...
- ADFUtils
import java.text.SimpleDateFormat; import java.util.Map; import javax.el.ELContext;import javax.el.E ...
- Spring(二十)之使用Log4j记录日志
日志记录,也是常用的,比如异常信息记录或者其他相关信息记录,良好的日志记录有助于当系统出现某些不是特别大的问题时,可及时通过日志信息,捕捉到异常,从而确定是那段代码的问题,避免影响其他的代码. 关于m ...
- spring bean中构造函数,afterPropertiesSet和init-method的执行顺序
http://blog.csdn.net/super_ccc/article/details/50728529 1.xml文件 <bean id="aaa" class=&q ...
- JSP的域对象的作用范围
<%-- Created by IntelliJ IDEA. User: tT丶 Date: 2017-12-12 Time: 14:53 To change this template use ...
- event对象,ie8及其以下
event 对象是 JavaScript 中一个非常重要的对象,用来表示当前事件.event 对象的属性和方法包含了当前事件的状态.当前事件,是指正在发生的事件:状态,是与事件有关的性质,如引发事件的 ...
- Servlet Struts2 SpringMVC 获取参数与导出数据 方法比较
servlet中通过request.getParameter()从网页获取参数 通过request session servletContext几个域对象的setAttribute(String ,O ...
- AtomicStampedReference解决ABA问题
在运用CAS做Lock-Free操作中有一个经典的ABA问题: 线程1准备用CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,又由C替换为A,然后线程1执行CAS时发现变量的值 ...
- SQL语句中生成UUID方法
SQL语句中生成UUID方法为UUID() 生成带横线UUID: select UUID() 形如:abaffaca-fd55-11e5-b3d0-d2 ...
- Wireshark工具抓包的数据包分析
Wireshark(前称Ethereal)是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料. Wireshark使用WinPCAP作为接口,直接与网卡 ...