天天看點

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

Caliburn.Micro學習筆記目錄

用了幾天時間看了一下開源架構Caliburn.Micro

這是他源碼的位址http://caliburnmicro.codeplex.com/

文檔也寫的很詳細,自己在看它的文檔和代碼時寫了一些demo和筆記,還有它實作的原理記錄一下

學習Caliburn.Micro要有MEF和MVVM的基礎

先說一下他的命名規則和引導類

以後我會把Caliburn.Micro的

Actions

IResult,IHandle

IConductor  ,Conductor<T>

這些常用功能寫下來。

先看一下Caliburn.Micro的大概流程,畫的不太好,先這樣吧

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

好了,我們開始今天的筆記。

從一個小例子說起  Demo下載下傳:BootstrapperAndConventions.rar

這個例子是有父窗體打開一下子窗體的小功能

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

程式要引入的三個類庫

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/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。