Caliburn.Micro学习笔记(一)----引导类和命名匹配规则
用了几天时间看了一下开源框架Caliburn.Micro
这是他源码的地址http://caliburnmicro.codeplex.com/
文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下
学习Caliburn.Micro要有MEF和MVVM的基础
先说一下他的命名规则和引导类
以后我会把Caliburn.Micro的
Actions
IResult,IHandle
IConductor ,Conductor<T>
这些常用功能写下来。
先看一下Caliburn.Micro的大概流程,画的不太好,先这样吧
好了,我们开始今天的笔记。
从一个小例子说起 Demo下载:BootstrapperAndConventions.rar
这个例子是有父窗体打开一下子窗体的小功能
程序要引入的三个类库
Caliburn.Micro
System.Windows.Interactivity
和
System.ComponentModel.Composition
上边两个Caliburn.Micro的例子里有提供下边的在Vs里就能找到
看一下引导类
public interface IShell
{
}
public class MyBootstrapper:Bootstrapper<IShell>
{
private CompositionContainer _container;
//用MEF组合部件
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);
}
//根据传过来的key或名称得到实例
protected override object GetInstance(Type service, string key)
{
string _contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(service) : key;
var _exports = _container.GetExportedValues<object>(_contract);
if (_exports.Any())
{
return _exports.First();
}
throw new Exception(string.Format("找不到{0}实例", _contract));
}
//获取某一特定类型的所有实例
protected override IEnumerable<object> GetAllInstances(Type service)
{
return _container.GetExportedValues<object>(AttributedModelServices.GetContractName(service));
}
//将实例传递给 Ioc 容器,使依赖关系注入
protected override void BuildUp(object instance)
{
_container.SatisfyImportsOnce(instance);
}
}
我们要实现Bootstrapper<T>这个类
一般我用我MEF做为容器,重写这个类的三个方法,写法也比较固定,就像上边我写的那这样
如果有自己的一些东西需要配置可以写在Config里
除了上边的三个方法还有OnStartup和OnExit分别是程序进入和退出的执行事件,可根据自己的需要做相应的重写
还要在App.xaml里加入
<Application x:Class="CalibrunMicAction.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:booter="clr-namespace:CalibrunMicAction">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<booter:Mybootstrapper x:Key="appbooter"/>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
这样程序 就会打开Export IShell的窗体
原理
是根据反射有MEF 去查找容器里是否有Exprort IShell的ViewModel如果有就根据名称去匹配相应的View映射关系并打开,
如果没有找到就抛出异常
<Window x:Class="WpfApplication1.MyMainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MyMainView" Height="300" Width="300">
<StackPanel>
<TextBlock x:Name="StrMain" FontSize="50"/>
<Button x:Name="OpenOneChild" Content="OpenAWindow" Width="120" Height="30"/>
</StackPanel>
</Window>
MainViewModel
using Caliburn.Micro;
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Linq;
using System.Text;
namespace WpfApplication1
{
[Export(typeof(IShell))]
public class MyMainViewModel
{
readonly IWindowManager _myWM;
public string StrMain
{
get;
private set;
}
[ImportingConstructor]
public MyMainViewModel(IWindowManager wm)
{
StrMain = "Main!!!!!!";
_myWM = wm;
}
MyChildOneViewModel _MyChildW = new MyChildOneViewModel();
public void OpenOneChild()
{
_myWM.ShowDialog(_MyChildW);
}
}
}
你会发现MainView的后台代码和前台都没有指定ViewModel
这是Caliburn.Microj里很棒的一点命名匹配规则,原理:它用利用反射和正则表达式去匹配View和ViewModel
系统现有的是自动匹配名称为View和ViewModel 、PageView和PageViewModel结尾的窗体和类
如果想自己定义一种匹配规则也是可以的,我这就就不讲了
运行起来你会发现
TextBlock和Button的属性和事件也自动匹配上了
原理:
匹配好View和ViewModel后
去查找View里的元素名称和viewModel里的方法或属性是否有一至的如果有一至的就绑定
!注意!:给控件命名的时候如txt_abc这样加下划线Calibrn会把这个名字分开
成txt和abc两个属性它会去txt属性里去找abc属性绑定
代码里打开子窗体是用的Caliburn.Micro自己的IWindowManager接口
这是一个专门用来打开窗体的类
它可以以Show() ShowDialog还有ShowPopup形式打开窗体
今天就先说到这,下次会写一下Caliburn的Actions
Demo下载:BootstrapperAndConventions.rar
- [Silverlight动画]转向行为 - 漫游行为
- [Silverlight动画]转向行为 - 对象回避
- [mobile开发碎碎念]手机页面上显示PDF文件
- Windows Server 2008 R2 配置AD(Active Directory)域控制器
- ios开发基础知识 - 2
- ios开发基础知识 - 1
- 为UINavigationBar添加自定义背景
- UIScrollView无法响应touches的解决方法
- WCF技术剖析之十七:消息(Message)详解(下篇)
- UITextView自动滚动的解决方案
- MVC解决Json DataGrid返回的日期格式是/Date(20130450000365)
- Easyui 让DataGrid适应浏览器宽度
- Easyui 让Window弹出居中与最大化后居中
- WCF技术剖析之十六:数据契约的等效性和版本控制
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 设计模式 | 适配器模式
- 设计模式 | 组合模式
- 设计模式 | 观察者模式
- 设计模式 | 原型模式
- CORS跨域资源共享及解决方案
- Vue 父子组件通信 兄弟组件通信 深层组件通信 方式一览
- Vue使用Element实现增删改查+打包
- 状态管理之Vuex (二) 异步管理
- Spring中AOP相关的API及源码解析,原来AOP是这样子的
- 状态管理之Vuex (一) 基操勿六
- 形式化分析工具(五)使用CAS +语法轻松编写HLPSL规范
- 你知道Spring是怎么将AOP应用到Bean的生命周期中的吗?
- 太实用了!自己动手写软件——密码验证器的界面实现
- 【TBase开源版测评】深度测评TBase的shard分片和冷热分离存储特性
- Python爬虫练手,一个简单的Python资讯采集案例