Caliburn.Micro學(xué)習(xí)筆記目錄
用了幾天時(shí)間看了一下開(kāi)源框架Caliburn.Micro
這是他源碼的地址http://caliburnmicro.codeplex.com/
文檔也寫(xiě)的很詳細(xì),自己在看它的文檔和代碼時(shí)寫(xiě)了一些demo和筆記,還有它實(shí)現(xiàn)的原理記錄一下
學(xué)習(xí)Caliburn.Micro要有MEF和MVVM的基礎(chǔ)
先說(shuō)一下他的命名規(guī)則和引導(dǎo)類(lèi)
以后我會(huì)把Caliburn.Micro的
Actions
IResult,IHandle
IConductor ,Conductor<T>
這些常用功能寫(xiě)下來(lái)。
先看一下Caliburn.Micro的大概流程,畫(huà)的不太好,先這樣吧

好了,我們開(kāi)始今天的筆記。
從一個(gè)小例子說(shuō)起 Demo下載:BootstrapperAndConventions.rar
這個(gè)例子是有父窗體打開(kāi)一下子窗體的小功能

程序要引入的三個(gè)類(lèi)庫(kù)
Caliburn.Micro
System.Windows.Interactivity
和
System.ComponentModel.Composition
上邊兩個(gè)Caliburn.Micro的例子里有提供下邊的在Vs里就能找到
看一下引導(dǎo)類(lèi)
| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 | 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>())); ///如果還有自己的部件都加在這個(gè)地方 CompositionBatch _batch = new CompositionBatch(); _batch.AddExportedValue<IWindowManager>(new WindowManager()); _batch.AddExportedValue<IEventAggregator>(new EventAggregator()); _batch.AddExportedValue(_container); _container.Compose(_batch); } //根據(jù)傳過(guò)來(lái)的key或名稱(chēng)得到實(shí)例 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}實(shí)例", _contract)); } //獲取某一特定類(lèi)型的所有實(shí)例 protected override IEnumerable<object> GetAllInstances(Type service) { return _container.GetExportedValues<object>(AttributedModelServices.GetContractName(service)); } //將實(shí)例傳遞給 Ioc 容器,使依賴(lài)關(guān)系注入 protected override void BuildUp(object instance) { _container.SatisfyImportsOnce(instance); } } |
我們要實(shí)現(xiàn)Bootstrapper<T>這個(gè)類(lèi)
一般我用我MEF做為容器,重寫(xiě)這個(gè)類(lèi)的三個(gè)方法,寫(xiě)法也比較固定,就像上邊我寫(xiě)的那這樣
如果有自己的一些東西需要配置可以寫(xiě)在Config里
除了上邊的三個(gè)方法還有OnStartup和OnExit分別是程序進(jìn)入和退出的執(zhí)行事件,可根據(jù)自己的需要做相應(yīng)的重寫(xiě)
還要在App.xaml里加入
| 1234567891011121314 | <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> |
這樣程序 就會(huì)打開(kāi)Export IShell的窗體
原理
是根據(jù)反射有MEF 去查找容器里是否有Exprort IShell的ViewModel如果有就根據(jù)名稱(chēng)去匹配相應(yīng)的View映射關(guān)系并打開(kāi),
如果沒(méi)有找到就拋出異常
| 123456789 | <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
| 1234567891011121314151617181920212223242526272829303132 | 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); } }} |
你會(huì)發(fā)現(xiàn)MainView的后臺(tái)代碼和前臺(tái)都沒(méi)有指定ViewModel
這是Caliburn.Microj里很棒的一點(diǎn)命名匹配規(guī)則,原理:它用利用反射和正則表達(dá)式去匹配View和ViewModel
系統(tǒng)現(xiàn)有的是自動(dòng)匹配名稱(chēng)為View和ViewModel 、PageView和PageViewModel結(jié)尾的窗體和類(lèi)
如果想自己定義一種匹配規(guī)則也是可以的,我這就就不講了
運(yùn)行起來(lái)你會(huì)發(fā)現(xiàn)
TextBlock和Button的屬性和事件也自動(dòng)匹配上了
原理:
匹配好View和ViewModel后
去查找View里的元素名稱(chēng)和viewModel里的方法或?qū)傩允欠裼幸恢恋娜绻幸恢恋木徒壎?/p>
!注意!:給控件命名的時(shí)候如txt_abc這樣加下劃線Calibrn會(huì)把這個(gè)名字分開(kāi)
成txt和abc兩個(gè)屬性它會(huì)去txt屬性里去找abc屬性綁定
代碼里打開(kāi)子窗體是用的Caliburn.Micro自己的IWindowManager接口
這是一個(gè)專(zhuān)門(mén)用來(lái)打開(kāi)窗體的類(lèi)
它可以以Show() ShowDialog還有ShowPopup形式打開(kāi)窗體
今天就先說(shuō)到這,下次會(huì)寫(xiě)一下Caliburn的Actions
Demo下載:BootstrapperAndConventions.rar
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注