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再次使我們的生活更輕松!
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應用程序很有用!
本教程源碼下載
好了,寫你的代碼吧:)