2009-06-02 8 views
3

En C#, je souhaite créer un panneau qui possède les propriétés d'un conteneur MDI. isMdiContainer = true.Panneau C# en tant que conteneur MDI

J'ai essayé quelque chose comme ça

form.MDIParent = this.panel1; 

Mais que le travail Do not. Aucune suggestion?

Répondre

2

Vous pouvez créer un formulaire personnalisé, supprimer toutes les bordures et barres d'outils pour qu'il ressemble le plus possible à un panneau. Faites ensuite de ce nouveau formulaire personnalisé un MdiContainer.

Fondamentalement, vous pouvez uniquement définir la propriété IsMDIContainer sur un formulaire. Cela signifie que seul un formulaire peut être un MdiContainer.

+0

Je ne ce que votre obtenir à mais vous ne pouvez pas avoir imbriqué formes MDI :( – Ozzy

+0

je enfin obtenir ce que vous Ment de la chose formulaire personnalisé Faites un contrôle utilisateur. D – Ozzy

10

Il est possible de créer un MDI-panneau et montrent des formes dans ce panneau, quelque chose comme le code ci-dessous fera le travail

definiton Mdi-Panel:

public class MdiClientPanel : Panel 
{ 
    private Form mdiForm; 
    private MdiClient ctlClient = new MdiClient(); 

    public MdiClientPanel() 
    { 
     base.Controls.Add(this.ctlClient); 
    } 

    public Form MdiForm 
    { 
     get 
     { 
      if (this.mdiForm == null) 
      { 
       this.mdiForm = new Form(); 
       /// set the hidden ctlClient field which is used to determine if the form is an MDI form 
       System.Reflection.FieldInfo field = typeof(Form).GetField("ctlClient", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
       field.SetValue(this.mdiForm, this.ctlClient); 
      } 
      return this.mdiForm; 
     } 
    } 
} 

Utilisation:

/// mdiChildForm is the form that should be showed in the panel 
/// mdiClientPanel is an instance of the MdiClientPanel 
myMdiChildForm.MdiParent = mdiClientPanel1.MdiForm; 
+0

MathiasJ,
Je tryied votre solution, mais coincé dans un problème: lorsque vous agrandissez un formulaire enfant, sa zone client s'adapte à tout l'espace disponible du panneau et la barre de titre (contenant les trois boutons * minimiser * et * fermer *) ne s'affiche nulle part ... Bye Gianni –

+0

Cela a fonctionné étonnamment bien pour moi sur un contrôle personnalisé que je voulais utiliser comme un conteneur MDI.Quelques tweaks (y compris le commentaire ci-dessus le mien) doivent être faites, mais autre que ça: Excellent travail. – Brandon

1

J'ai utilisé la réponse de Mathias ci-dessus et j'ai pu me débarrasser de la plupart des problèmes soulevés dans les commentaires. J'ai également créé une classe d'aide pour les formulaires enfants, au cas où quelqu'un voudrait l'utiliser et/ou l'améliorer.

public class MdiClientPanel : Panel 
{ 
    private MdiClient _ctlClient = new MdiClient(); 

    // Callback event when a child is activated 
    public delegate void ActivateHandler(object sender, MdiClientForm child); 
    public event ActivateHandler OnChildActivated; 

    /// <summary> 
    /// The current active child form 
    /// </summary> 
    public Form ActiveMDIWnd 
    { 
     get; 
     set; 
    } 

    /// <summary> 
    /// List of available forms 
    /// </summary> 
    public List<MdiClientForm> ChildForms = new List<MdiClientForm>(); 

    /// <summary> 
    /// Std constructor 
    /// </summary> 
    public MdiClientPanel() 
    { 
     base.Controls.Add(_ctlClient); 
    } 

    private Form _mdiForm = null; 
    public Form MdiForm 
    { 
     get 
     { 
      if (_mdiForm == null) 
      { 
       _mdiForm = new Form(); 
       // Set the hidden _ctlClient field which is used to determine if the form is an MDI form 
       System.Reflection.FieldInfo field = typeof(Form).GetField("ctlClient", 
        System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 

       field.SetValue(_mdiForm, _ctlClient); 
      } 
      return _mdiForm; 
     } 
    } 

    private void InitializeComponent() 
    { 
     SuspendLayout(); 
     ResumeLayout(false); 
    } 

    /// <summary> 
    /// Add this Form to our list of children and set the MDI relationship up 
    /// </summary> 
    /// <param name="child">The new kid</param> 
    /// <returns>The new kid</returns> 
    public MdiClientForm AddChild(MdiClientForm child) 
    { 
     child.MyMdiContainer = this; 
     child.MdiParent = MdiForm; 
     ChildForms.Add(child); 

     return child; 
    } 

    /// <summary> 
    /// The user sent a "restore" command, so issue it to all children 
    /// </summary> 
    public void RestoreChildForms() 
    { 
     foreach (DataTableForm child in ChildForms) 
     { 
      child.WindowState = FormWindowState.Normal; 
      child.MaximizeBox = true; 
      child.MinimizeBox = true; 
     } 
    } 

    /// <summary> 
    /// Send the Activated message to the owner of this panel (if they are listening) 
    /// </summary> 
    /// <param name="child">The child that was just activated</param> 
    public void ChildActivated(MdiClientForm child) 
    { 
     ActiveMDIWnd = child; 

     if (OnChildActivated != null) 
      OnChildActivated(this, child); 
    } 

    /// <summary> 
    /// The child closed so remove them from our available form list 
    /// </summary> 
    /// <param name="child">The child that closed</param> 
    public void ChildClosed(MdiClientForm child) 
    { 
     ChildForms.Remove(child); 
    } 
} 

/// <summary> 
/// A wrapper class for any form wanting to be an MDI child of an MDI Panel 
/// </summary> 
public class MdiClientForm : Form 
{ 
    /// <summary> 
    /// My parent MDI container 
    /// </summary> 
    public MdiClientPanel MyMdiContainer { get; set; } 

    /// <summary> 
    /// Standard Constructor 
    /// </summary> 
    public MdiClientForm() 
    { 
     Activated += OnFormActivated; 
     FormClosed += OnFormClosed; 
    } 

    /// <summary> 
    /// Reports back to the container when we close 
    /// </summary> 
    void OnFormClosed(object sender, FormClosedEventArgs e) 
    { 
     MyMdiContainer.ChildClosed(this); 
    } 

    /// <summary> 
    /// Reports back to the parent container when we are activated 
    /// </summary> 
    private void OnFormActivated(object sender, EventArgs e) 
    { 
     MyMdiContainer.ChildActivated(this); 
    } 
}