2009-03-18 5 views
1

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]); 
     } 
     } 
    } 
} 


+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()? –

Répondre

2

Avant de passer, je pense que votre méthode de composition doit être nettoyé. Pourquoi ajoutez-vous le conteneur et le catalogue dans le lot?

batch.AddExportedObject(_container); 
batch.AddExportedObject(catalog); 

AddExportedObject est utilisé pour ajouter une instance d'objet préexistant comme une exportation et il ne fait pas beaucoup de sens d'essayer d'utiliser le conteneur et le catalogue des exportations

privat void Compose() 
{ 
    var catalog = 
     new AssemblyCatalog(typeof(ITab).Assembly); 

    var batch = 
     new CompositionBatch(); 
    batch.AddPart(this); 

    var container = 
     new CompositionContainer(catalog); 
    container.Compose(batch); 
} 
+0

ok mais je viens de copier le Compose à partir du code d'exemple du site Mef. –

0

Voici une version générique qui vous permet d'échanger votre formulaire winforms avec un autre utilisant Mef. Il y a une interface IForm qui est exposée en utilisant Mef et il a une méthode appelée public void MoveForm (Formulaire) et il copie le nouveau formulaire sur l'ancien formulaire.

Voici le code.



//// Form1 default form 
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 
    { 
     void MoveForm(Form form); 
    } 

    public partial class Form1 : Form 
    { 
     private CompositionContainer _container; 

     [Import] 
     public IEnumerable Forms { get; set; } 

     public Form1() 
     { 
     Compose(); 
     InitializeComponent(); 

     foreach (IForm form in Forms) 
     { 
      this.SuspendLayout(); 
      this.Controls.Clear(); // wipe out the current version of the form 
      this.ResumeLayout(false); 
      form.MoveForm(this); 
     } 

     } 

     private void Compose() 
     { 
     var catalog = new AssemblyCatalog(typeof(IForm).Assembly); 
     var batch = new CompositionBatch(); 
     batch.AddPart(this); 

     _container = new CompositionContainer(catalog); 
     _container.Compose(batch); 
     } 
    } 
} 

//// Form 2 uses Mef to replace Form1 
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(IForm))] 
    public partial class Form2 : Form,IForm 
    { 
     public Form2() 
     { 
     InitializeComponent(); 
     } 


     public void MoveForm(Form form) 
     { 
     this.SuspendLayout(); 
     form.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); 
     form.ResumeLayout(false); 
     } 
    } 
} 



Questions connexes