Caliburn.Micro入門教程5,視窗管理器
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的時候,會發現沒有太多提及到視窗管理器。出於這個原因,我會簡單地解釋一下我瞭解的東西,我不會涵蓋一切。
為了演示如何使用視窗管理器,我們將擴充套件我們在本系列的第一篇部落格。
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應用程式很有用!
相關文章
- 視窗管理器 xmonad 教程
- SQL輕鬆入門(5):視窗函式SQL函式
- Qt入門(14)——父視窗部件和子視窗部件QT
- Qt入門(15)——使用視窗部件QT
- macos視窗管理器:Lasso for MacMac
- red5入門教程
- Groovy入門視訊教程
- Qt入門(16)——組裝視窗部件QT
- Qt入門(19)——自定義視窗部件QT
- ASP.NET Core 入門教程 5、ASP.NET Core MVC 檢視傳值入門ASP.NETMVC
- AutoCAD快速入門(二):圖形視窗
- Maven 5 分鐘入門教程Maven
- SDL3 入門(2):第一個視窗
- 雙視窗檔案管理器Commander One
- Go Qt5 建立空白視窗、視窗居中及關閉視窗事件GoQT事件
- .Net5 WPF快速入門系列教程
- PyQt5 之主視窗QT
- PyQT5之視窗QT
- pyqt5建立主視窗(介紹視窗型別)QT型別
- i3 視窗管理器使 Linux 更美好Linux
- MVC5+EF6 入門完整教程九MVC
- MVC5+EF6 入門完整教程八MVC
- MVC5+EF6 入門完整教程四MVC
- MVC5 + EF6 入門完整教程MVC
- MVC5+EF6 入門完整教程五MVC
- MVC5+EF6 入門完整教程六MVC
- MVC5+EF6 入門完整教程七MVC
- MVC5+EF6 入門完整教程十MVC
- CXF入門教程(5) -- webService非同步呼叫模式Web非同步模式
- Rust 包管理器 Cargo 入門RustCargo
- iMovie 入門教程:視訊編輯的利器
- 【視訊】Entity Framework Core 2.* 入門教程Framework
- PyQt5 之視窗居中QT
- MVC5 + EF6 入門完整教程二MVC
- MVC5 + EF6 完整入門教程三MVC
- Hive視窗函式保姆級教程Hive函式
- 推薦 7 個 Python 入門視訊教程Python
- macos視窗管理器:Lasso for Mac v1.6.3啟用版Mac