C# WPF Caliburn.Micro框架下利用Mef加载其它项目界面

01

前言

    MEF是微软自家的托管可扩展框架,在这里我把它用成了ioc容器。在Caliburn.Micro框架下,view和viewmodel被注入到CompositionContainer容器中,然后通过名称可以实现view和viewmodel的匹配。利用这一特点,在多人合作项目开发中,一个解决方法就可以拆分成很多个项目,只用在主项目中搭建框架,每个分支项目开发好以后加载到容器中,就可以实现界面和逻辑的调用,可能这样解释有点生涩,具体我们看下面实例再去理解。

02


新建项目MefTest

第一步 :在我们的解决方法下添加新的项目MefTest(类库)

0c254c536ba589b6256b52fdc0df820c.png

第二步:MefTest下添加MefTestView.xaml和MefTestViewModel.cs

MefTestViewModel:

[Export(typeof(MefTestViewModel))] 一般是继承公共的接口并导出,当然像我这样直接导出也是可以的.

//[Export("PluginTestViewModel", typeof(IPluggablePart))]//[PartCreationPolicy(CreationPolicy.Shared)]///也可以这样[Export(typeof(MefTestViewModel))]//表示此类需要导出,导出的类型为objectpublic class MefTestViewModel{public void MefTestBtn(){MessageBox.Show("这是一个mef的测试类");}public int Sum(int a ,int b){return a + b;}}

MefTestView.xaml:

<UserControl x:Class="MefTest.MefTestView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:MefTest"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><Grid ShowGridLines="True"><Grid.RowDefinitions><RowDefinition Height="*"/><RowDefinition Height="*"/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><Button Name="MefTestBtn" Content="MefTestBtn" Background="LightCoral" FontSize="45"/></Grid>
</UserControl>

03


通过Mef注入dll

详细代码如下:

DisplayRootViewFor<StartViewModel>();//显示界面

这里也可以让主界面的viewmodel继承一个公共的接口,比如IShell,这样这里接可以改写为:

DisplayRootViewFor<IShell>();//显示界面
using Caliburn.Micro;
using MefTest;
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.ComponentModel.Composition.Primitives;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows;namespace CaliburnTest
{class MyBootstrapper : BootstrapperBase{public MyBootstrapper(){Initialize();//初始化框架}//容器,装东西用的。具体装什么先不管。CompositionContainer container;//[Import]//public MefTestParts mefTestParts { get; set; }protected override void OnStartup(object sender, StartupEventArgs e){DisplayRootViewFor<StartViewModel>();//显示界面}//private IDialogManager dialogManager = PlatformIoC.Get<IDialogManager>();//[Import(typeof(ContainerTest))]//public ContainerTest ts { get; set; }/// <summary>/// 方法1/// </summary>protected void Configure0(){var envirmentPath = System.IO.Directory.GetCurrentDirectory();//AssemblyCatalog 目录的一种,表示在程序集中搜索var assemblyCatalog = new AssemblyCatalog(typeof(StartViewModel).Assembly);//此处这一句实际上没啥用,因为此程序集下没有任何我们需要的实例(各种handler)//在某个目录下的dll中搜索。//var directoryCatalog = new DirectoryCatalog(@"C:\Program Files (x86)\YWTK\TOOLS\PLUGIN-LIBS\MISC\I12\", "*.dll");var directoryCatalog = new DirectoryCatalog(envirmentPath, @"ContainerDLL.dll");var aggregateCatalog = new AggregateCatalog(assemblyCatalog, directoryCatalog);//创建搜索到的部件,放到容器中。container = new CompositionContainer(aggregateCatalog);var batch = new CompositionBatch();      //如果还有自己的部件都加在这个地方batch.AddExportedValue<IWindowManager>(new WindowManager());batch.AddExportedValue<IEventAggregator>(new EventAggregator());batch.AddExportedValue(container);this.container.Compose(batch);}/// <summary>/// 方法2/// </summary>protected override void Configure(){var envirmentPath = System.IO.Directory.GetCurrentDirectory();AssemblySource.Instance.Add(Assembly.LoadFile(Path.Combine(envirmentPath, @"MefTest.dll")));//AssemblySource.Instance.Add(Assembly.LoadFile(Path.Combine(envirmentPath, @"PluginTest.dll")));var catalog = new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>());this.container = new CompositionContainer(catalog);var batch = new CompositionBatch();      //如果还有自己的部件都加在这个地方batch.AddExportedValue<IWindowManager>(new WindowManager());batch.AddExportedValue<IEventAggregator>(new EventAggregator());batch.AddExportedValue(this.container);this.container.Compose(batch);}protected override object GetInstance(Type service, string key){if (service == null){return null;}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("Could not locate any instances of contract {0}.", contract));}protected override IEnumerable<object> GetAllInstances(Type service){return container.GetExportedValues<object>(AttributedModelServices.GetContractName(service));}protected override void BuildUp(object instance){container.SatisfyImportsOnce(instance);}protected override void OnExit(object sender, EventArgs e){base.OnExit(sender, e);this.Application.Shutdown();}}}

04


主程序加载和调用

StartView.xaml中添加一个tab页:

<TabItem x:Name="Up5" Header="MefTest" ><ContentControl cal:View.Model="{Binding MefTestView}"/></TabItem>

viewmodel中:

定义 MefTestViewModel

public MefTestViewModel MefTestView  { get;set;}

然后在主程序的构造函数中通过ioc获取viewmodel实例:

MefTestView = IoC.Get<MefTestViewModel>();

这样其它项目的界面就成功的被加载到了我们的主项目中,然而我们并没有实例化,这样如果我们定义了公共的接口,直接导出接口类型,就很好地实现了主项目和子项目的解耦。

05


运行结果

1d7e7e9273088587284b74e93fbd927e.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

女朋友竟然提出这种奇怪的要求......

1 为什么女朋友会提这么奇怪的要求&#xff1f;▼2 我的数学能力▼3 一看就是老龙人了阁下是古墓派传人吧▼4 如果可爱能晋级的话你已经赢了▼5 要做个与众不同的垃圾▼6 女孩子喜欢帅哥是不分年龄的▼‍‍7 单身狗又做错了什么呢&#xff1f;▼扫描这个二维码你将会有机…

Java编码规范,在您进行编码之前应该阅读的规范

为什么80%的码农都做不了架构师&#xff1f;>>> 本文转载于&#xff1a;http://www.web3d.com.cn/new/teach/java3d/2006/11/13/363276161.html Java编码规范 说明 1.1 为什么要有编码规范 编码规范对于程序员而言尤为重要&#xff0c;有以下几个原因&#xff1a; …

.NET Core 如何调试 CPU 爆高?

在这篇文章中我们将会分析一个 CPU 爆高的案例&#xff0c;测试demo链接 &#xff1a;https://docs.microsoft.com/en-us/samples/dotnet/samples/diagnostic-scenarios/ 。你将会学到&#xff1a;如何使用 dotnet-counters 确定真实的 cpu 使用率。使用 dotnet-trace 追踪代码…

[OIBH] 糖果盒(Candy Box)——又一个最大子矩形

http://codewaysky.sinaapp.com/problem.php?id1056 这题和奶牛浴场略有区别&#xff0c;奶牛浴场只需要求出最大子矩形&#xff0c;而这题要求的是最大权重子矩形&#xff0c;不一定要最大的面积&#xff0c;但要最大的权重和 思路是先求出每个最大子矩形&#xff0c;然后求出…

日本第一赘婿!他入赘近20年拿下诺贝尔奖,成名后不忘教光棍讨老婆......

全世界只有3.14 % 的人关注了爆炸吧知识谁能凭感性要诺贝尔奖私有1949年12月10号&#xff0c;日本民众发出了暌违多年的欢呼声&#xff0c;因为诺贝尔奖史无前例地颁给了一位日本物理学家——汤川秀树。报道汤川秀树获奖新闻的报纸获奖后&#xff0c;在自传《旅人&#xff1a;一…

修改mongodb最大查询数_WebFlux系列(十二)MongoDB应用,新增、修改、查询、删除

#Java#Spring#SpringBoot#Mongo#reactor#webflux#数据库#新增#修改#查询#删除#Spring Boot WebFlux Mongo数据库新增、删除、查询、修改视频讲解 : https://www.bilibili.com/video/av84240038/Employee.javapackage com.example.spring.webfluxmongo;import lombok.AllArgsCon…

为什么每个理发店门口都有彩色的柱子?你不知道吧

全世界只有3.14 % 的人关注了爆炸吧知识为什么街上的理发店门口都有一根旋转着的彩色灯柱&#xff1f;好学的小编忍不住去寻找真相...理发店门口彩色的柱子这根彩柱与医疗有关彩柱通常是3种颜色&#xff0c;白红蓝。一般认为&#xff1a;白色绷带&#xff0c;红色绷带上的血(动…

是否显示展开_Creo7.0教程之绝对精度对钣金件展开的作用详解

在讲Creo7.0绝对精度对钣金展开的帮助之前&#xff0c;我们有必要先来说明一下Creo的精度定义。刚使用Creo7.0版本的新建模型&#xff0c;很多网友就问&#xff0c;怎么模板文件中有两个同样单位的选择&#xff0c;“abs”和“rel”有什么区别&#xff1f;新建文件选项其实这就…

知乎点赞超过10万的科学脱单法!这绝对是我见过最硬核的撩妹套路......

全世界只有3.14 % 的人关注了爆炸吧知识科学脱单硬核撩妹前两天&#xff0c;超模君在知乎上看到一个热门的问答&#xff1a;开学后如何快速找到对象&#xff1f;这个话题&#xff0c;让超模君回想起了当年刚进入大学的那会儿&#xff0c;校园中秀恩爱的情侣无处不在&#xff0c…

office 高效办公智慧树_干货高效实用的office办公小技巧之word篇

对于office三剑客ppt、Word、Excel的使用成了日常&#xff0c;作为办公党&#xff0c;今天就拿出自己在平时工作之中发现、学到的小技巧来做个总结&#xff0c;分享给大家。相信很多大神对于这些小技巧都已经精通&#xff0c;所以lz会先列出目录&#xff0c;大家可以自行依据目…

POJ 1904 【强连通分量】.cpp

题意&#xff1a; 很久很久以前.. 有一个国王.. 他有好几个儿子.. 这些王子都喜欢上了邻国的公主.. 他们准备迎娶自己喜欢的公主中的一个.. 国王就让宰相给列一个清单.. 宰相就给了国王一个清单..上面写明了哪个王子将迎娶哪个邻国的公主.. 但是调皮的国王不太满意~~ 他还想知道…

电梯里为什么放镜子?90%的人都不知道

全世界只有3.14 % 的人关注了爆炸吧知识随着高层建筑不断的拔地而起我们每天可能会上下十几层的高楼人们当然不想去爬楼梯所以电梯已成为生活中必不可少的一部分▼我们几乎每天都会坐电梯上班时、回家时、逛街时当我们每走进电梯时第一动作都会干什么呢大概都会先看自己的妆容再…

WPF中的命令(Command)

这节来讲一下WPF中的命令(Command)的使用。【认识Command】我们之前说过&#xff0c;WPF本身就为我们提供了一个基础的MVVM框架&#xff0c;本节要讲的命令就是其中一环&#xff0c;通过在ViewModel中声明命令&#xff0c;从View中使用Binding绑定命令&#xff0c;就能实现从Vi…

matlab中给图像加几个矩形框_没想到!PPT中的这个效果,用好了,简直就是渣图美化器...

相信大家一定看到过&#xff0c;透过磨砂玻璃呈现在眼前的景色&#xff0c;是不是有种朦胧美&#xff1f;其实&#xff0c;在PPT中你也可以复刻出这样的效果。例如&#xff0c;这样的PPT页面&#xff1a;把背景虚化掉&#xff0c;更加突出主题。你想知道PPT中的磨砂效果&#x…

宝贝,我帮你清了购物车哦!

1 一场意外让本不富裕的女朋友雪上加霜甚至还回复了单身▼2 外甥女去参加舅舅的婚礼发现账本上没有她的名字于是写上自己的名字并随了兜里所有的钱人情世故整的明明白白▼3 我感觉再多吹几首他们就能复合......▼4 在家隔离第N天果然天下沙雕是一家▼5 我猜中了开头但没猜…

Dapr牵手.NET学习笔记:Actor小试

Actor模型是一种避免线程共享数据&#xff0c;相同Actor实体串行化的方案&#xff0c;所以不便dapr的其他功能&#xff0c;几乎都是非编程入侵的&#xff0c;相反&#xff0c;Dapr Acror深度定制的&#xff0c;关于Actor&#xff0c;.net中有一些通用框架&#xff0c;比如Akka.…

黄聪:wordpress如何开启文章格式post format

发现很多“古老”的WordPress主题使用量非常大&#xff0c;虽然部分也在随着WordPress版本的升级而“升级”&#xff0c;只不过是修复了bug而已&#xff0c;wordpress的新特性并没有使用。而且多数国内的wordpress主题制作者&#xff0c;也都是在这些主题的基础上进行创作&…

11没有源码注释_我们为什么要看源码、应该如何看源码?

看源码的意义看源码只是一种方法、手段&#xff0c;而不是目的。我也曾经给自己制定过“阅读xxx源码”的目标&#xff0c;现在看起来真的很蠢&#xff0c;一点不smart&#xff08;specific、measurable、attainable、relevant、time-bound&#xff09;。只有搞清楚了阅读代码的…

如果你没空读书,就一定要来看看这8个公众号!

全世界只有3.14 % 的人关注了爆炸吧知识不管世界变化多块&#xff0c;阅读仍是个不过时的动作。今天就为大家推荐几个优质公众号&#xff0c;从社会热点、读书成长、生活新知&#xff0c;你的碎片化时间&#xff0c;我们包了&#xff01;一起来看看呀~♥长按二维码&#xff0c;…

03Prism WPF 入门实战 - Region

1.概要源码及PPT地址&#xff1a;https://github.com/JusterZhu/wemail视频地址&#xff1a;https://www.bilibili.com/video/BV1KQ4y1C7tg?sharesourcecopyweb&#xff08;1&#xff09;Prism概览Application&#xff1a;我们开发应用程序&#xff0c;初始化Bootstrapper。Bo…