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
Caliburn.Micro学习笔记(一)----引导类和命名匹配规则的更多相关文章
- Caliburn.Micro学习笔记目录
Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 Caliburn.Micro学习笔记(二)----Actions Caliburn.Micro学习笔记(三)----事件聚合IE ...
- Caliburn.Micro学习笔记目录——li-peng
Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 Caliburn.Micro学习笔记(二)----Actions Caliburn.Micro学习笔记(三)----事件聚合IE ...
- Caliburn.Micro学习笔记(二)----Actions
Caliburn.Micro学习笔记目录 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions, ...
- Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>
Caliburn.Micro学习笔记目录 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现 ...
- Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能
Caliburn.Micro学习笔记目录 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双 ...
- Caliburn.Micro学习笔记(五)----协同IResult
Caliburn.Micro学习笔记目录 今天说一下协同IResult 看一下IResult接口 /// <summary> /// Allows custom code to execu ...
- Caliburn.Micro学习笔记目录——Zhouyongh
解析Caliburn.Micro(一) 解析Caliburn.Micro(二) 解析Caliburn.Micro(三) 解析Caliburn.Micro(四) Illusion = Caliburn. ...
- Caliburn micro 学习笔记...
页面跳转 LLS 结合 CM 使用方法 事件处理
- [WPF] Caliburn Micro学习二 Infrastructure
Caliburn Micro学习一 Installation http://blog.csdn.net/alvachien/article/details/12985415 Step 1. 无论是通过 ...
随机推荐
- 强大css3制作新浪LOGO 胜过PS
请使用支持CSS3的浏览器查看效果:http://keleyi.com/a/bjad/6lu3dgj8.htm 效果图: 完整代码如下: <html> <head> <t ...
- Sass-也许你想和CSS玩耍起来(下篇)
问心无愧,共勉! sass-也许你想和CSS玩耍起来(上篇) 上篇中主要介绍了一些sass的基本特性.下篇中,主要是写一些我们常用的sass控制命令,函数和规则. sass进阶 控制命令 可能看过上篇 ...
- ArcSDE给Oracle添加SDE函数包
SDE函数包中包含大量的空间计算分析函数,是我们做空间相关分析的一把利刃(目前好像我们只有这一把),有关SDE函数的使用,请见我空间另外的一篇帖子的附件.按照通常教程,过程是这样的1.找到listen ...
- Android Touch事件传递机制 二:单纯的(伪生命周期)
转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...
- Android高效计算——RenderScript(一)
高效计算——RenderScript RenderScript是安卓平台上很受谷歌推荐的一个高效计算平台,它能够自动把计算任务分配到各个可用的计算核心上,包括CPU,GPU以及DSP等,提供十分高效的 ...
- Android的四大组件之Activity
Android的四大组件之Activity Activity:是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,B ...
- ios手势操作,四个基本事件与六个常用事件
基本事件包括begin,canceled,move,ended四项,如果对象的hidden属性为yes,则无效果,hidden属性必须为no;才能使用: -(void)touchesBegan:(NS ...
- Oracle解锁,解决“ora00054:资源正忙”错误
Oracle解锁,解决“ora00054:资源正忙”错误 一.处理步骤:--1.获取被锁对象的session_idSELECT session_id FROM v$locked_object; --2 ...
- Elasticsearch-HttpServerModule
HttpServerModule的请求主要由HttpServer中的HttpServerTransport(默认为NettyHttpServerTransport)类处理. NettyHttpServ ...
- Python简单爬虫入门一
为大家介绍一个简单的爬虫工具BeautifulSoup BeautifulSoup拥有强大的解析网页及查找元素的功能本次测试环境为python3.4(由于python2.7编码格式问题) 此工具在搜索 ...