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 14 2017 Week 7 Tuesday
Love lives in cottages as well as in courts. 爱情无贵贱,贫富皆有之. Many people, especially boys, complain tha ...
- 深入理解PHP传参原理(PHP5.2)
首先说下今天想到的一个问题.在编写php扩展的时候,似乎参数(即传给zend_parse_parameters的变量)是不需要free的.举例: PHP_FUNCTION(test) { char* ...
- 绘图、Core Animation与硬件架构
原文地址:http://blog.csdn.net/wzzvictory/article/details/11180241 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wan ...
- im2rec打包图片
https://mxnet.incubator.apache.org/faq/finetune.html python ~/mxnet/tools/im2rec.py --list --recursi ...
- mysql.sock问题
Can't connect to local MySQL server through socket '/tmp/mysql.sock' 上述提示可能在启动mysql时遇到,即在/tmp/mysql. ...
- 解决FileUpload上传大文件报错
<system.webServer> <security> <requestFiltering> <requestLimits maxAllowedConte ...
- Xcode 9.3 pod install update 错误
[!] Oh no, an error occurred. Search for existing GitHub issues similar to yours: https://github.com ...
- mybatis传单个参数,和<if>标签同时使用的问题
// Mapper.java EmerEvent selectByAlarmId(Integer alarmId); // Mapper.xml <select id="selectB ...
- mysql 8.0.12 日常出错
最近不知道怎么回事,数据库老是会输出一个: [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and co ...
- ubuntu网卡配置及安装ssh服务
1.ubuntu网卡配置 1.查看网卡名称 ip a 2.进行编辑网卡配置文件 sudo vi /etc/network/interfaces 更改网卡配置文件添加内容修改内容如下:下面的enp0s3 ...