当前位置: 首页 > 编程语言 > C#

Winforms与MEF共享

时间:2023-04-10 18:56:16 C#

Winforms与MEF我有一个使用不同选项卡的winforms应用程序。我想使用MEF来添加更多在启动时导入的选项卡。我很难弄清楚如何去做这件事。编辑:这就是我所做的。我采用了主要的winforms类并将其条带化,以便只有一个TabControl,我通过一个接口向每个TabPage公开它。然后我还创建了第二个接口ITab,我将其与MEF一起使用以获取标签页,然后将其添加到主标签控件。要创建一个新选项卡,我只是添加一个新窗体,然后向其添加一个选项卡控件并设计选项卡。我在新窗体中添加了ITab界面,并添加了如下方法将页面移动到主窗体中。publicvoidMoveTabPages(IFormfm){while(this.tabControl1.Controls.Count>0){fm.tab.Controls.Add(this.tabControl1.Controls[0]);}}事件委托和所有好的东西都有效,只要它们只引用表单类中的内容。这是完整的代码。//Form1.cs使用系统;使用System.Collections.Generic;使用System.ComponentModel;使用系统数据;使用系统绘图;使用System.Linq;使用系统文本;使用System.Windows.Forms;使用System.ComponentModel.Composition;使用System.ComponentModel.Composition.Hosting;命名空间Winforms_Mef{公共接口IForm{TabControltab{get;}}publicinterfaceITab{voidMoveTabPages(IFormfm);}publicpartialclassForm1:Form,IForm{privateCompositionContainer_container;[导入]publicIEnumerableTabs{get;放;}publicTabControltab{get{returntabControl1;}}publicForm1(){撰写();初始化组件();foreach(ITabtabinTabs){tab.MoveTabPages(this);}}privatevoidCompose(){varcatalog=newAssemblyCatalog(typeof(ITab).Assembly);varbatch=newCompositionBatch();batch.AddPart(这个);_container=newCompositionContainer(目录);_container.Compose(批处理);}}}//Form2.cs使用系统;使用使用System.ComponentModel;使用系统数据;使用系统绘图;使用System.Linq;使用系统文本;使用System.Windows.Forms;使用System.ComponentModel.Composition;namespaceWinforms_Mef{[Export(typeof(ITab))]publicpartialclassForm2:Form,ITab{publicForm2(){InitializeComponent();}publicvoidMoveTabPages(IFormfm){while(this.tabControl1.Controls.Count>0){fm.tab.Controls.Add(this.tabControl1.Controls[0]);}}}}在继续之前,我认为您的Compose方法需要清理为什么要向批处理中添加容器和目录?batch.AddExportedObject(_container);batch.AddExportedObject(目录);AddExportedObject用于添加预先存在的对象实例作为导出,尝试使用容器和目录作为导出没有多大意义privatvoidCompose(){varcatalog=newAssemblyCatalog(typeof(ITab).Assembly);varbatch=newCompositionBatch();batch.AddPart(这个);varcontainer=newCompositionContainer(catalog);container.Compose(批处理);这是一个通用版本,允许您使用Mef将您的winforms表单换成另一个。有一个使用Mef公开的IForm接口,它有一个名为publicvoidMoveForm(Formform)的方法,该方法将新表单复制到旧表单上。这是代码。以上就是C#学习教程:使用MEF分享Winforms的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——////Form1defaultformusingSystem;使用System.Collections使用System.ComponentModel;使用系统数据;使用系统绘图;使用System.Linq;使用系统文本;使用System.Windows.Forms;使用System.ComponentModel.Composition;;命名空间Winforms_Mef{publicinterfaceIForm{voidMoveForm(Formform);}publicpartialclassForm1:Form{privateCompositionContainer_container;[导入]publicIEnumerableForms{get;放;}publicForm1(){撰写();初始化组件();foreach(表单中的IForm表单){this.SuspendLayout();这个.Controls.Clear();//清除当前版本的表单this.ResumeLayout(false);表单.MoveForm(这个);}}privatevoidCompose(){varcatalog=newAssemblyCatalog(typeof(IForm).Assembly);varbatch=newCompositionBatch();batch.AddPart(这个);_container=新C_container.Compose(批处理);}}}////Form2使用Mef替换Form1usingSystem;使用System.Collections.Generic;使用System.ComponentModel;使用系统数据;使用System.Drawing使用System.Linq;使用系统文本;使用System.Windows.Forms;使用System.ComponentModel.Composition;namespaceWinforms_Mef{[Export(typeof(IForm))]publicpartialclassForm2:Form,IForm{publicForm2(){InitializeComponent();}publicvoidMoveForm(Formform){this.SuspendLayout();表单.SuspendLayout();form.AutoScaleDimensions=this.AutoScaleDimensions;form.AutoScaleMode=this.AutoScaleMode;form.ClientSize=this.ClientSize;form.Name=this.Name;form.Text=this.Text;while(this.Controls.Count>0){form.Controls.Add(this.Controls[0]);}this.ResumeLayout(false);形式.ResumeLayout(false);}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: