Caliburn Micro的窗口管理器能夠經過ViewModel建立窗口,你只須要傳遞一個ViewModel實例給窗口管理器,窗口管理器就會自動查找對應的View,並做爲一個窗口或對話框打開,在打開前還能夠對view的部分依賴屬性進行配置。markdown
窗口管理器在CM中很是重要,應用程序建立新窗口,彈出對話框等使用窗口管理器都是很是方便的。可是在CM中WindowManager在每一個平臺(WPF、Silverlight、WindowsPhone、WinRT)上的實現都不相同。因此,想徹底瞭解有點困難,就連官方文檔都沒有詳細說明。因此,爲了簡便起見,本文也只對WPF上的WindowManager進行介紹。app
要使用窗口管理器,就須要有一個窗口管理器的對象。咱們一般作法就是在Bootstrapper中配置IOC時,建立一個WindowManager並導入到IOC容器(能夠參考學習以前Bootstrapper配置相關文章)。配置IOC的代碼能夠是這樣的(在本文中都是以MEF爲IOC容器爲示例的):ide
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(container); container.Compose(batch); }
而後咱們在須要使用WindowManager的ViewModel中提取WindowManager對象。具體作法以下:函數
[Export(typeof(ShellViewModel))] public class ShellViewModel : PropertyChangedBase { private readonly IWindowManager _windowManager; [ImportingConstructor] //必須加入這個,這是由於用MEF在建立ShellViewModel實例時,有[ImportingConstructor]標記的構造函數的參數會自動使用容器內相應的export對象 public ShellViewModel(IWindowManager windowManager) { _windowManager = windowManager; } ... }
使用WindowManager反而很簡單,以下代碼會建立一個新的ShellViewModel,並根據ShellViewModel找到ShellView,而後顯示ShellView窗口,ShellViewModel會成爲ShellView的dataContext。佈局
public void NewWindow() { _windowManager.ShowWindow(new ShellViewModel(_windowManager)); }
Window Manager中打開窗口,對話框和彈出窗口,均可以,只須要調用不一樣的方法便可。你能夠在 Caliburn Micro 自帶的 HelloWindowManager 示例中,看到WindowManager窗口管理器的更多用法。學習
在WindowManager建立窗口時,能夠傳遞參數給新的窗口的屬性。這能更好的使您根據您的須要,更細的控制您的應用程序。能夠參考以下示例:atom
public void NewWindow() { var settings = new Dictionary<string, object> { { "Topmost", true }, { "Owner", GetView() } }; //Owner不是依賴屬性不能綁定,但在這裏設置是能夠的 _windowManager.ShowDialog(new ConfigViewModel(), null, settings); }
上述示例中,我把新窗口的Topmost設置爲true,Owner設置爲當前ViewModel綁定的窗口(若是當前ViewModel繼承了ViewAware或Screen等,就能夠調用GetView方法獲取View對象)。url
有些狀況下,實現自定義的窗口管理器是有用的。若是你須要在全部窗口實例中設置屬性都是同樣的值,用它就很好。例如,屬性可能包括icon圖標,窗口狀態,窗口大小和自定義程序樣式。我發如今Windows中最常設置的屬性是「SizeToContent」。默認狀況下,Caliburn Micro是設置SizeToContent.WidthAndHeight。這意味着該窗口根據它的內容自動調整自身大小。雖然有時能夠方便的這樣作,但我發現這會致使一些問題:某些應用程序的佈局和設置窗口時,默認狀況下最大化會致使越界。spa
建立一個自定義的窗口管理器是很是簡單的。首先添加一個繼承於「WindowManager」的類,接下來,能夠重寫「EnsureWindow」方法,作一些相似以下:.net
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()來建立窗口實例。接下來,你能夠設置一下你想要的窗口中的屬性,而後簡單地返回窗口實例。
以後只須要用自定義窗口管理器代替默認的窗口管理器,就能夠實現你想要的效果。好比你能夠用以下方式添加你的自定義窗口管理器:
batch.AddExportedValue<IWindowManager>(new AppWindowManager());
這樣會致使全部使用窗口管理器的地方,報告CM內部都會採用你的自定義窗口管理器。