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解决方案。