У меня есть приложение winforms, которое использует различные вкладки. Я хотел бы использовать MEF, чтобы иметь возможность добавлять больше вкладок, которые импортируются при запуске. Мне трудно понять, как это сделать.
Edit:
Вот что я сделал.
Я взял основной класс winforms и разложил его так, чтобы в нем был только TabControl, который я открываю для каждой вкладки через интерфейс. Затем я также создаю второй интерфейс ITab, который я использую с MEF, чтобы получить вкладку, а затем добавляю его в основной tabcontrol. Чтобы создать новую вкладку, я просто добавляю новую форму, а затем добавляю к ней tabcontrol и проектирую вкладки. Я добавляю интерфейс ITab в новую форму и добавляю следующий метод, который перемещает страницы в основную форму.
public void MoveTabPages(IForm fm)
{
while (this.tabControl1.Controls.Count > 0)
{
fm.tab.Controls.Add(this.tabControl1.Controls[0]);
}
}
Делегаты событий и все эти хорошие вещи работают до тех пор, пока они ссылаются только на то, что находится в их классе формы.
Вот полный код.
//Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
namespace Winforms_Mef
{
public interface IForm
{
TabControl tab { get; }
}
public interface ITab
{
void MoveTabPages(IForm fm);
}
public partial class Form1 : Form,IForm
{
private CompositionContainer _container;
[Import]
public IEnumerable Tabs { get; set; }
public TabControl tab
{
get { return tabControl1; }
}
public Form1()
{
Compose();
InitializeComponent();
foreach (ITab tab in Tabs)
{
tab.MoveTabPages(this);
}
}
private void Compose()
{
var catalog =new AssemblyCatalog(typeof(ITab).Assembly);
var batch = new CompositionBatch();
batch.AddPart(this);
_container =new CompositionContainer(catalog);
_container.Compose(batch);
}
}
}
//Form2.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel.Composition;
namespace Winforms_Mef
{
[Export(typeof(ITab))]
public partial class Form2 : Form,ITab
{
public Form2()
{
InitializeComponent();
}
public void MoveTabPages(IForm fm)
{
while (this.tabControl1.Controls.Count > 0)
{
fm.tab.Controls.Add(this.tabControl1.Controls[0]);
}
}
}
}