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再次使我们的生活更轻松!
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应用程序很有用!
本教程源码下载
好了,写你的代码吧:)