国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Caliburn.Micro學(xué)習(xí)筆記(一)----引導(dǎo)類(lèi)和命名匹配規(guī)則

2019-11-11 01:36:19
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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)

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849public 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

1234567891011121314151617181920212223242526272829303132using 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


上一篇:sizeof&quot;ALL&quot;

下一篇:I/O重定向

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 岳阳县| 元氏县| 思南县| 延安市| 茶陵县| 房产| 衡水市| 彩票| 高碑店市| 儋州市| 丹江口市| 临澧县| 大方县| 新泰市| 乌恰县| 东乌| 双牌县| 泉州市| 双鸭山市| 新民市| 水富县| 渭南市| 南开区| 张家港市| 大足县| 通山县| 酒泉市| 阿瓦提县| 黄浦区| 夏邑县| 黄陵县| 南京市| 浪卡子县| 汉阴县| 五常市| 大安市| 夏津县| 甘泉县| 东明县| 莒南县| 玛纳斯县|