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 窗口管理器的更多相关文章

  1. Caliburn.Micro 杰的入门教程6, Screens 和 Conductors 简介

    Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...

  2. Caliburn.Micro 杰的入门教程4,事件聚合器

    Caliburn.Micro 杰的入门教程1(原创翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(原创翻译)Caliburn.Micro 杰的入门 ...

  3. Caliburn.Micro 杰的入门教程3,事件和参数

    Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...

  4. Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)

    Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...

  5. Caliburn.Micro 杰的入门教程1(翻译)

    Caliburn.Micro 杰的入门教程1(原创翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程 ...

  6. 无废话ExtJs 入门教程三[窗体:Window组件]

    无废话ExtJs 入门教程三[窗体:Window组件] extjs技术交流,欢迎加群(201926085) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3 ...

  7. [Caliburn.Micro专题][1]快速入门

    目录 1. 什么是Caliburn.Micro? 2. 我是否需要学习CM框架? 3. 如何下手? 3.1 需要理解以下几个概念: 3.2 工程概览 3.3 示例代码 开场白:本系列为个人学习记录,才 ...

  8. AvalonDock 2.0+Caliburn.Micro+MahApps.Metro实现Metro风格插件式系统(一)

    随着IOS7由之前UI的拟物化设计变为如今的扁平化设计,也许扁平化的时代要来了,当然我们是不是该吐槽一下,苹果什么时候也开始跟风了,自GOOGLE和微软界面扁平化过后,苹果也加入了这一队伍. Aval ...

  9. Caliburn.Micro - 框架搭建

    简介:Caliburn.Micro是Caliburn的一个轻量级版本开源架构,可以用于wpf,sliverlight,wp7等,和注重模块化的Prism比起来也有许多优点,具体比较可以参考 此文 ht ...

随机推荐

  1. ubuntu16.4安装php7+apache2+mysql环境全过程记录

    1.安装apache2 sudo apt-get install apache2 2.安装php7 sudo apt-get install php7.0 3.apache 识别php插件(不是必须, ...

  2. 异常:Neither BindingResult nor plain target object for bean name 'command' available as request attribute

    Neither BindingResult nor plain target object for bean name 'command' available as request attribute ...

  3. Django 查询集的过滤内置条件

    条件选取querySet的时候,filter表示=,exclude表示!=.querySet.distinct() 去重复__exact 精确等于 like 'aaa' __iexact 精确等于 忽 ...

  4. 关于mvvm:UI、数据、绑定、状态、中间变量、数据适配、数据处理

    绑定: UI控件 --> VM    VM -> UI控件 关于mvvm:UI.数据.绑定.状态.中间变量.数据适配.数据处理: https://github.com/zzf073/Log ...

  5. jQuery 实现改变图片指定区域的颜色

    javascript本身无法改变图片的颜色,不过我们可以通过一些技巧来实现一样的效果. 1.首先我们要知道图片哪些区域需要改变颜色,这里我们可以用执点地图的方法来弄 例1: <img src=& ...

  6. 【[TJOI2014]上升子序列】

    这本质上是一个\(dp\) 如果没有"两个上升子序列相同,那么只需要计算一次"这一个性质,那么就很好做了,我们用\(dp[i]\)表示以\(i\)结尾的上升子序列个数,那么就有\( ...

  7. Linux学习总结(三)之 putty,xshell远程连接及密钥认证篇

     一:putty 下载 1:认准两个地方 a. Download putty b. chiark greenend 2:下载32位的zip包,这是一个工具包合集,不单是一个终端工具 二:putty设置 ...

  8. Mac安装composer爬过的坑

    1.首先安装brew/usr/bin/ruby -e "$(curl -fsSLhttps://raw.githubusercontent.com/Homebrew/install/mast ...

  9. 1.springboot:入门项目

    简介: Springboot 来简化spring应用开发,约定大于配置,去繁从简,just run 就可以创建一个独立的,产品应用 背景: J2EE笨重开发,繁多的配置,低下的开发效率,复杂的部署流程 ...

  10. 关于sharepoint如何做SSO,如何做OOS监视编辑

    应客户需求,需要做sharepoint SSO,以前都是默认的AD验证,如果客户已经有一套SSO系统,验证过SSO之后就能自动登录,而不是浏览器上设置保存用户名密码的AD登陆. 怎么做呢? 首先sha ...