Caliburn.Micro學習筆記(一)----引導類和命名匹配規則

來源:互聯網
上載者:User

標籤: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學習筆記(一)----引導類和命名匹配規則

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.