天天看點

Caliburn.Micro 傑的入門教程5,Window Manager 視窗管理器

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 5: The Window Manager

http://www.mindscapehq.com/blog/index.php/2012/3/13/caliburn-micro-part-5-the-window-manager/

 你們中許多人在啃Caliburn Micro的時候,會發現沒有太多提及到視窗管理器。出于這個原因,我會簡單地解釋一下我了解的東西,我不會涵蓋一切。

為了示範如何使用視窗管理器,我們将擴充我們在本系列的第一篇部落格。

1.Using a Window Manager

你可能還記得在入門的部落格文章說的,我們做的第一件事就是從項目中删除MainWindow.xaml 。 Caliburn Micro需要初始化視窗,設定它的data context(資料上下文)和給我們顯示相應的視圖。視窗管理器就是有效的處理它們的機制之一。

當您運作建構Caliburn Micro應用程式,視窗管理器被自動用于建立啟動視窗。對于小型的應用程式,對視窗管理器隻需要了解這些就行。當你正在建構需要顯示其他視窗或對話框等較大的應用程式時,就是時候來學習如何使用視窗管理器了。

為了證明這一點,我們将添加一個按鈕,點選後,程式将打開一個新視窗。

首先,在AppView.xaml中添加一個按鈕,然後将click事件和AppViewModel.cs中的方法關聯。使用Caliburn Micro約定在前面的教程中解釋了你可以做到這一點。我定義方法名為“OpenWindow ” 。

在的openWindow方法中,我們将需要通路視窗管理器的一個執行個體。雖然我們可以簡單地建立新視窗,而不使用視窗管理器,但是這是最好的做法,用來擷取Caliburn Micro提供給應用程式的,保持全球化的視窗管理器執行個體。我們可以通過在AppViewModel.cs構造函數中,添加一個IWindowManager并将其存儲在一個字段上,來做到這一點。你可能還記得這個部落格系列的第4部分,當你在一個ViewModel建立一個構造函數時,至少要有1個參數。

下面是3個簡單的步驟回顧一下:

1。更新bootstrapper引導程式如下。記得添加System.ComponentModel.Composition。dll引用。

using Caliburn.Micro;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.ComponentModel.Composition.Primitives;
 
public class AppBootstrapper : Bootstrapper<AppViewModel>
{
  private CompositionContainer container;
 
  protected override void Configure()
  {
    container = new CompositionContainer(new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()));
 
    CompositionBatch batch = new CompositionBatch();
 
    batch.AddExportedValue<IWindowManager>(new WindowManager());
    batch.AddExportedValue<IEventAggregator>(new EventAggregator());
    batch.AddExportedValue(container);
 
    container.Compose(batch);
  }
 
  protected override object GetInstance(Type serviceType, string key)
  {
    string contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(serviceType) : key;
    var exports = container.GetExportedValues<object>(contract);
 
    if (exports.Count() > 0)
    {
      return exports.First();
    }
 
    throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));
  }
}      

2. 在 AppViewModel 類中,添加”Export“特性: 

[Export(typeof(AppViewModel))]
public class AppViewModel : PropertyChangedBase
{
  ...
}      

3. 在 AppViewModel 類中,為構造函數添加 ”ImportingConstructor“特性:

private readonly IWindowManager _windowManager;
 
[ImportingConstructor]
public AppViewModel(IWindowManager windowManager)
{
  _windowManager = windowManager;
}      

現在我們可以使用Window Manager執行個體在我們的openWindow方法來打開一個新視窗。為了保持本教程的簡單,我們将簡單地建立也使用AppViewModel作為新視窗的data context資料上下文。使用下面的代碼來完成的:

public void OpenWindow()
{
  _windowManager.ShowWindow(new AppViewModel(_windowManager));
}      

現在運作一下,然後按下按鈕,會看到另一個視窗出現。

所有我們需要做的是通過傳遞一個ViewModel的一個執行個體。然後從建立視窗執行個體,到為我們顯示ViewModel相應的View的一切,都會完成。Caliburn Micro再次使我們的生活更輕松!

Caliburn.Micro 傑的入門教程5,Window Manager 視窗管理器

Window Manager有各種各樣的方法和方法重載打開視窗,對話框和彈出視窗。所有這些方法是相當直截了當的,易于使用。

你可以在 Caliburn Micro 自帶的 HelloWindowManager 示例中,看到WindowManager視窗管理器的更多用法。

還有一件事,我想看看'settings'參數。在這裡,你可以傳遞dynamic類型的動态對象來給新的視窗中設定屬性。這能更好的使您根據您的需要,更細的控制您的應用程式。

下面是一個例子,我設定了WindowStartupLocation為 manual 而不是 center-owner。

2.Custom Window Managers

 有些情況下,實作自定義的視窗管理器是有用的。如果你需要在所有視窗執行個體中設定屬性都是一樣的值,用它就很好。例如,屬性可能包括icon圖示,視窗狀态,視窗大小和自定義程式樣式。我發現在Windows中最常設定的屬性是“SizeToContent”。預設情況下,Caliburn Micro是設定SizeToContent.WidthAndHeight。這意味着該視窗根據它的内容自動調整自身大小。雖然有時可以友善的這樣做,但我發現這會導緻一些問題:

某些應用程式的布局和設定視窗時,預設情況下最大化會導緻越界。

建立一個自定義的視窗管理器是非常簡單的。首先添加一個繼承于“WindowManager”的類,接下來,可以重寫“EnsureWindow”方法,做一些類似如下:

protected override Window EnsureWindow(object model, object view, bool isDialog)
{
  Window window = base.EnsureWindow(model, view, isDialog); 
  window.SizeToContent = SizeToContent.Manual;
 
  return window;
}      

在這個方法中,我們首先通過調用base.EnsureWindow()來建立視窗執行個體。接下來,你可以設定一下你想要的視窗中的屬性,然後簡單地傳回視窗執行個體。最後一步是設定自定義的視窗管理器,以在全球範圍内使用的應用程式的執行個體。在這篇部落格文章的第一個代碼片段,我們進行修改引導程式。在這裡,你可以看到我們給“CompositionBatch”添加了一個WindowManager執行個體。您可以添加一個和下面的執行個體類似的,自定義的視窗管理器的執行個體:

batch.AddExportedValue<IWindowManager>(new AppWindowManager());      

這就是我想要的一切,來使用視窗管理器,我希望你覺得它在建構Caliburn Micro的WPF應用程式很有用!

本教程源碼下載下傳

好了,寫你的代碼吧:)

繼續閱讀