標籤:style blog http io ar color os sp for
用了幾天時間看了一下開源架構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裡就能找到
看一下引導類
1 public interface IShell 2 { 3 4 } 5 public class MyBootstrapper:Bootstrapper<IShell> 6 { 7 8 private CompositionContainer _container; 9 10 //用MEF組合組件11 protected override void Configure()12 {13 _container = new CompositionContainer(14 new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()));15 16 ///如果還有自己的組件都加在這個地方17 CompositionBatch _batch = new CompositionBatch();18 _batch.AddExportedValue<IWindowManager>(new WindowManager());19 _batch.AddExportedValue<IEventAggregator>(new EventAggregator());20 _batch.AddExportedValue(_container);21 22 23 _container.Compose(_batch);24 }25 //根據傳過來的key或名稱得到執行個體26 protected override object GetInstance(Type service, string key)27 {28 string _contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(service) : key;29 30 var _exports = _container.GetExportedValues<object>(_contract);31 32 if (_exports.Any())33 {34 return _exports.First();35 }36 throw new Exception(string.Format("找不到{0}執行個體", _contract));37 }38 //擷取某一特定類型的所有執行個體39 protected override IEnumerable<object> GetAllInstances(Type service)40 {41 return _container.GetExportedValues<object>(AttributedModelServices.GetContractName(service));42 }43 //將執行個體傳遞給 Ioc 容器,使依賴關係注入44 protected override void BuildUp(object instance)45 {46 _container.SatisfyImportsOnce(instance);47 }48 49 }
我們要實現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映射關係並開啟,
如果沒有找到就拋出異常
1 <Window x:Class="WpfApplication1.MyMainView"2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"4 Title="MyMainView" Height="300" Width="300">5 <StackPanel>6 <TextBlock x:Name="StrMain" FontSize="50"/>7 <Button x:Name="OpenOneChild" Content="OpenAWindow" Width="120" Height="30"/>8 </StackPanel>9 </Window>
MainViewModel
1 using Caliburn.Micro; 2 using System; 3 using System.Collections.Generic; 4 using System.ComponentModel.Composition; 5 using System.Linq; 6 using System.Text; 7 8 namespace WpfApplication1 9 {10 [Export(typeof(IShell))]11 public class MyMainViewModel12 {13 readonly IWindowManager _myWM;14 public string StrMain15 {16 get;17 private set;18 }19 [ImportingConstructor]20 public MyMainViewModel(IWindowManager wm)21 {22 StrMain = "Main!!!!!!";23 _myWM = wm;24 }25 MyChildOneViewModel _MyChildW = new MyChildOneViewModel();26 public void OpenOneChild()27 {28 29 _myWM.ShowDialog(_MyChildW);30 }31 }32 }
你會發現MainView的後台代碼和前台都沒有指定ViewModel
這是Caliburn.Microj裡很棒的一點命名匹配規則,原理:它用利用反射和Regex去匹配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/本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。
Caliburn.Micro學習筆記(一)----引導類和命名匹配規則