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
作者:李鵬
出處:http://www.cnblogs.com/li-peng/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。