J'ai une application winforms qui utilise différents onglets. Je voudrais utiliser MEF pour pouvoir ajouter plus d'onglets importés au démarrage. J'ai du mal à comprendre comment faire ça.Winforms avec MEF
Editer: Voici ce que j'ai fait.
J'ai pris la classe principale des winforms et l'ai réduite pour qu'il n'y ait plus qu'un TabControl dans lequel j'expose à chaque TabPage via une interface. Je crée ensuite une deuxième interface ITab que j'utilise avec MEF pour obtenir les onglets, puis je l'ajoute au tabcontrol principal. Pour créer une nouvelle page d'onglet, il suffit ensuite d'ajouter un nouveau formulaire, puis d'y ajouter un contrôle de tabulation et de concevoir les pages à onglet. J'ajoute l'interface ITab au nouveau formulaire et ajoute la méthode suivante qui déplace les pages vers le formulaire principal. Les délégués d'événements et toutes ces bonnes choses fonctionnent tant qu'ils ne font référence qu'à ce qui se trouve dans leur classe de formulaire.
Voici le code complet.
//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]);
}
}
}
}
Pouvez-vous donner plus de détails? Quel type d'événements devez-vous gérer? Quelles sont vos exportations/importations? Où avez-vous vu MyInitializeComponent()? –