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() > )
{
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应用程序很有用!
本教程源码下载
好了,写你的代码吧:)
Caliburn.Micro 杰的入门教程5,Window Manager 窗口管理器的更多相关文章
- Caliburn.Micro 杰的入门教程6, Screens 和 Conductors 简介
Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...
- Caliburn.Micro 杰的入门教程4,事件聚合器
Caliburn.Micro 杰的入门教程1(原创翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(原创翻译)Caliburn.Micro 杰的入门 ...
- Caliburn.Micro 杰的入门教程3,事件和参数
Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...
- Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)
Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...
- Caliburn.Micro 杰的入门教程1(翻译)
Caliburn.Micro 杰的入门教程1(原创翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程 ...
- 无废话ExtJs 入门教程三[窗体:Window组件]
无废话ExtJs 入门教程三[窗体:Window组件] extjs技术交流,欢迎加群(201926085) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3 ...
- [Caliburn.Micro专题][1]快速入门
目录 1. 什么是Caliburn.Micro? 2. 我是否需要学习CM框架? 3. 如何下手? 3.1 需要理解以下几个概念: 3.2 工程概览 3.3 示例代码 开场白:本系列为个人学习记录,才 ...
- AvalonDock 2.0+Caliburn.Micro+MahApps.Metro实现Metro风格插件式系统(一)
随着IOS7由之前UI的拟物化设计变为如今的扁平化设计,也许扁平化的时代要来了,当然我们是不是该吐槽一下,苹果什么时候也开始跟风了,自GOOGLE和微软界面扁平化过后,苹果也加入了这一队伍. Aval ...
- Caliburn.Micro - 框架搭建
简介:Caliburn.Micro是Caliburn的一个轻量级版本开源架构,可以用于wpf,sliverlight,wp7等,和注重模块化的Prism比起来也有许多优点,具体比较可以参考 此文 ht ...
随机推荐
- February 2 2017 Week 5 Thursday
Only do what your heart tells you. 随心而行. My heart tells me that I should leave here and go back to X ...
- Maven项目打包jar依赖外部jar
有时候我们想要做一些java 的小程序,需要把打包成jar,单独执行,做一个maven项目,maven非常方便,有自动打包成jar的插件,但是有时候我们的项目可能会依赖其他的jar包,所以非常麻烦. ...
- 汇编试验四:[bx] 和 loop 的使用
预备知识: 段前缀的使用: ffff:0~ffff:b 和 0020:0~0020:b 的数据: 一次循环的复制效果: 但是,这种方式DS的数据得修改: Source Code: assume cs: ...
- Coursera机器学习基石 第2讲:感知器
第一讲中我们学习了一个机器学习系统的完整框架,包含以下3部分:训练集.假设集.学习算法 一个机器学习系统的工作原理是:学习算法根据训练集,从假设集合H中选择一个最好的假设g,使得g与目标函数f尽可能低 ...
- sendmail启动报错
sendmail启动不了,报错如下: 解决方法: 在/etc/mail/sendmail.cf 配置文件中查找 Dj$w,并在此行下面增加这一行. Dj$w. 在/etc/hosts 增加一行 192 ...
- HDU 1027 Ignatius and the Princess II(求第m个全排列)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1027 Ignatius and the Princess II Time Limit: 2000/10 ...
- H5基本标签
- unittest单元测试框架之测试环境的初始化与还原(fixture)(五)
1.方法一:针对每条测试用例进行初始化与还原 import unittest from UnittestDemo.mathfunc import * class TestMathFunc(unitte ...
- Flask—08-建立自己的博客(02)
博客项目 上一篇内容完善 自定义字段验证函数 class RegisterForm(FlaskForm): ... def validate_username(self, field): user = ...
- oracle系列(四)PL/SQL
过程,函数,触发器是PL/SQL编写的,存储在oracle中的.PL/SQL是非常强大的数据库过程语言. PL/SQL优点:性能,模块化,网络传输量,安全性缺点:移植性不好 简单分类:块:过程,函数, ...