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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM