C# 使用MEF动态加载不同的userControl,并实现不同userControl之间通信

1、 首先在项目的引用中添加:System.ComponentModel.Composition和bbv.Common.EventBroker

其中bbv.Common.EventBroker引用的dll库在http://sourceforge.net/projects/bbvcommon/中可以下载,如果获取不到,可以留言与我,我提供给大家。
如图所示:

2、具体代码实现

1)、主窗体代码:

 public partial class frmMain : Form
    {
        private void initMEF()
        {
            AggregateCatalog aggregateCatalog = new AggregateCatalog();//声明一个集合
            AssemblyCatalog assemblyCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());//声明当前应用程序的cataLog
            aggregateCatalog.Catalogs.Add(assemblyCatalog);//将当前应用程序的catalog加入到该集合中
            CompositionContainer compositionContainer = new CompositionContainer(aggregateCatalog);//声明一个容器
            compositionContainer.ComposeParts(this);//创建组件

        }
        [Import("user")]
        private UserControlTest userControlTest { set; get; }
        public frmMain()
        {
            InitializeComponent();
            initMEF();//初始化MEF
            panel1.Controls.Clear();
            panel1.Controls.Add(userControlTest);
            EventBroker eventBroker = new EventBroker();
            eventBroker.Register(userControlTest);
            eventBroker.Register(this);

        }
        [EventSubscription(EventTopics.firstEvent, typeof(Background))]
        public void receiver(object obj, EventArgs args)
        {
            //System.Threading.Thread.Sleep(3000);
            MessageBox.Show("收到消息了");
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Text = DateTime.Now.ToString("hh:mm:ss.fff");
        }
    }

2)userControl代码:

[Export("user")]
    public partial class UserControlTest : UserControl
    {
        public UserControlTest()
        {
            InitializeComponent();
        }
        [EventPublication(EventTopics.firstEvent)]
        public event EventHandler testEvent;

        private void btnTest_Click(object sender, EventArgs e)
        {
            testEvent(this,EventArgs.Empty);
            //System.Threading.Thread.Sleep(3000);
        }

    }

3) EventTopics.cs的代码:

 public class EventTopics
    {
       public const string firstEvent = "test";
    }
时间: 2024-10-11 17:32:17

C# 使用MEF动态加载不同的userControl,并实现不同userControl之间通信的相关文章

页面滚动图片等元素动态加载插件jquery.scrollLoading.js

如果一个网页很长,那么该页面的加载时间也会相应的较长.而这里给大家介绍的这个jQuery插件scrollLoading的作用则是,对页面元素进行动态加载,通俗的说就是滚到哪就加载到哪,屏幕以下看不见的就不用加载了.这样还可以在一定程度上节省服务器资源.该插件作者的网页将该插件的功能和使用方法描述的非常详细,这里把最一般最普遍的使用情况给大家展现一下. 插件作者:http://www.zhangxinxu.com/ 首先我们需要加载jQuery库和本插件js文件. (jquery.scrollLo

EasyUi -- 如何根据动态加载panel和Datagrid

在做项目的过程中,前台的面板和表格一般都不是固定的,它是根据后台传来的数据进行变化的.举个例子: 实现: 看一下我们的效果图: 这个上面的最左边的Panel要根据系别动态加载,有多少个系别就要加载都少个Panel,Panel里面的是一个table,这个里面也是动态加载出来. 右边是一个datagrid,datagrid里面的工作效率.业务能力等等也都是数据库动态加载出来的,包括后面的ABCD也是动态的. 这样就算数据库中的数据怎么变,这里都会动态地加载出来.那么怎么实现这些功能呢? 一.动态加载

Python模块动态加载机制

本文和大家分享的主要是python中模块动态加载机制相关内容,一起来看看吧,希望对大家学习python有所帮助. import 指令 来看看 import sys 所产生的指令: co_consts : (0, None) co_names : ('sys',) 0 LOAD_CONST               0 (0) 2 LOAD_CONST               1 (None) 4 IMPORT_NAME              0 (sys) 6 STORE_NAME  

黄聪:AngularJS 动态加载控制器实例-ocLoazLazy

一.AngularJS动态加载控制器和视图实例 路由配置关键代码: [javascript] view plain copy print? //二级页面 $stateProvider.state('main', { url: '/:name', /**如果需要动态加载数据和控制器***/ views: { "": { templateUrl: function ($stateParams) { console.info($stateParams); return '/template/

动态加载JS

res/js/modules/s01.js alert("动态加载JS成功!");  形式1: <script src="layui-v1.0.9_rls/layui.js"></script> <script> layui.use("res/js/modules/s01"); </script> 形式2: <script src="layui-v1.0.9_rls/layui.js

Mybatis学习(6)动态加载、一二级缓存

一.动态加载: resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: 如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当需要查询用户信息时再查询用户信息.把对用户信息的按需去查询就是延迟加载. 需要先说明下是按照这个sql的思路来实现延迟加载的: mysql> select orders.*, (select user.username from us

【JSTREE】动态加载子节点

js中初始化jstree $('#contact-org').jstree({ "data" : { "dataType": 'json', "url":function(node){ return ctxPath + "/v-contact?queryOrg"; }, "data":function(node){ return {"id" : node.id}; } } } } 返回的

7. 反射技术:其实就是动态加载一个指定的类

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1.获得Class对象,就是获取到指定的名称的字节码文件对象. 2.实例化对象,获得类的属性.方法或构造函数. 3.访问属性.调用方法.调用构造函数创建对象. 获取这个Class对象,有三种方式: 1:通过每个对象都具备的方法getClass来获取.

jquery easyui datagrid 动态 加载列

实现方式: 首先根据输入的sql语句获得相关的列名称返回给前台,然后在datagrid中动态加载列,接着根据查询条件(包括sql语句)获取相关的记录返回给前台用于填充datagrid.从而实现类似oracle web版的sql查询. 前台主要js为: Js代码   function sqlSearch(){ var sqlStatement = $.trim($("#sqlStatementId").val()); if(sqlStatement == null || sqlState