Caliburn.Micro中的WindowManager

Window Manager 簡介

Caliburn Micro的窗口管理器能夠經過ViewModel建立窗口,你只須要傳遞一個ViewModel實例給窗口管理器,窗口管理器就會自動查找對應的View,並做爲一個窗口或對話框打開,在打開前還能夠對view的部分依賴屬性進行配置。markdown

窗口管理器在CM中很是重要,應用程序建立新窗口,彈出對話框等使用窗口管理器都是很是方便的。可是在CM中WindowManager在每一個平臺(WPF、Silverlight、WindowsPhone、WinRT)上的實現都不相同。因此,想徹底瞭解有點困難,就連官方文檔都沒有詳細說明。因此,爲了簡便起見,本文也只對WPF上的WindowManager進行介紹。app

WPF中應用Window Manager

要使用窗口管理器,就須要有一個窗口管理器的對象。咱們一般作法就是在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);
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

而後咱們在須要使用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;
}
  ...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

使用WindowManager反而很簡單,以下代碼會建立一個新的ShellViewModel,並根據ShellViewModel找到ShellView,而後顯示ShellView窗口,ShellViewModel會成爲ShellView的dataContext。佈局

public void NewWindow()
{
   _windowManager.ShowWindow(new ShellViewModel(_windowManager));
}
  • 1
  • 2
  • 3
  • 4

Window Manager中打開窗口,對話框和彈出窗口,均可以,只須要調用不一樣的方法便可。你能夠在 Caliburn Micro 自帶的 HelloWindowManager 示例中,看到WindowManager窗口管理器的更多用法。學習

WindowManager的setting參數

在WindowManager建立窗口時,能夠傳遞參數給新的窗口的屬性。這能更好的使您根據您的須要,更細的控制您的應用程序。能夠參考以下示例:atom

public void NewWindow()
{
     var settings = new Dictionary<string, object> { { "Topmost", true }, { "Owner", GetView() } };
     //Owner不是依賴屬性不能綁定,但在這裏設置是能夠的
     _windowManager.ShowDialog(new ConfigViewModel(), null, settings);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

上述示例中,我把新窗口的Topmost設置爲true,Owner設置爲當前ViewModel綁定的窗口(若是當前ViewModel繼承了ViewAware或Screen等,就能夠調用GetView方法獲取View對象)。url

自定義WindowManager

有些狀況下,實現自定義的窗口管理器是有用的。若是你須要在全部窗口實例中設置屬性都是同樣的值,用它就很好。例如,屬性可能包括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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在這個方法中,咱們首先經過調用base.EnsureWindow()來建立窗口實例。接下來,你能夠設置一下你想要的窗口中的屬性,而後簡單地返回窗口實例。

以後只須要用自定義窗口管理器代替默認的窗口管理器,就能夠實現你想要的效果。好比你能夠用以下方式添加你的自定義窗口管理器:

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

這樣會致使全部使用窗口管理器的地方,報告CM內部都會採用你的自定義窗口管理器。

參考連接

 

出處:https://blog.csdn.net/hustlei/article/details/86699377

相關文章
相關標籤/搜索