Laden...

Custom ContainerControl

Erstellt von ErfinderDesRades vor 14 Jahren Letzter Beitrag vor 14 Jahren 4.370 Views
ErfinderDesRades Themenstarter:in
5.299 Beiträge seit 2008
vor 14 Jahren
Custom ContainerControl

Hi!

Hier ein UserControl "MyGroupControl", dem man im Designer Controls zufügen kann, und die landen dann im dafür vorgesehenen Bereich.
Das DesignerVerhalten steuert man, indem man einen geeigneten Designer hinzuattributiert.
In diesem Fall ist für MyGroupControl ein eigener Designer geschrieben, und für das ContentPanel der bereits bestehende ParentControlDesigner gewählt, da nur minimale Möglichkeiten freigeschaltet werden sollen.


using System.ComponentModel;
using System.Windows.Forms;

namespace ContainerUcl {
   
   /// <summary>
   /// ein UserControl mit einem ContentPanel, auf das man Controls ablegen kann
   /// </summary>
   [Designer(typeof(MyGroupControlDesigner))]
   public partial class MyGroupControl : UserControl {

      public MyGroupControl() {         InitializeComponent();      }

      [DesignerSerializationVisibility( DesignerSerializationVisibility.Content )]
      public ContentPanel ContentPanel {
         get { return contentPanel; }
      }

   }
}


using System.Windows.Forms;
using System.ComponentModel;
using System.Security.Permissions;

namespace ContainerUcl {

   /// <summary>
   /// Designerklasse für das UserControl MyGroupControl, die den DesignMode fürdas ContentPanel freischaltet
   /// </summary>
   [PermissionSet( SecurityAction.Demand, Name = "FullTrust" )]
   public class MyGroupControlDesigner : System.Windows.Forms.Design.ControlDesigner {

      private MyGroupControl m_myGroupControl = null;

      public override void Initialize( IComponent a_component ) {
         base.Initialize( a_component );
         m_myGroupControl = (( MyGroupControl )a_component);
         EnableDesignMode(m_myGroupControl.ContentPanel, "ContentPanel");
      }
      //es sind viele weitere Overrides möglich, um das Designer-Verhalten des designeten Controls anzpassen
   }
}

Um den ParentControlDesigner ans ContentPanel attributieren zu können, muß ein eigenes Control geschrieben werden, auch hier ist die einfachste Version gewählt:


using System.ComponentModel;
using System.Windows.Forms;
using System.Windows.Forms.Design;

namespace ContainerUcl {

   // das ParentControlDesigner-Attribut ermöglicht, im Designer hier was drauf zu droppen
   [Designer(typeof(ParentControlDesigner))]
   [System.ComponentModel.DesignerCategory("Code")]
   public class ContentPanel : Control {   }
}

Der frühe Apfel fängt den Wurm.