¿Cómo puedo hacer que mi control de usuario solo se pueda agregar en un cierto tipo de control (aquí en mi caso, específicamente SplitContainer )?
Necesitas cuidar algunas cosas:
Cuando suelta el control de la caja de herramientas en una superficie de diseño, debe evitar que se suelte en un control no deseado; es responsabilidad del método CreateComponents de la clase ToolBoxItem asignada al control.
Después de agregar el control a la superficie de diseño (por ejemplo, en el padre deseado), debe evitar arrastrarlo sobre los controles no deseados; es responsabilidad del método CanBeParentedTo de la clase ControlDesigner asignada al control.
Finalmente, es posible que desee incluso evitar agregarlo a controles no deseados mediante programación en tiempo de ejecución; que en este caso, es responsabilidad del método OnParentChanged del control.
Ejemplo: limitar un control para que se aloje solo en un SplitterContainer
using System; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing.Design; using System.Windows.Forms; using System.Windows.Forms.Design; [ToolboxItem(typeof(MyControlToolBoxItem))] [Designer(typeof(MyControlDesigner))] public class MyControl : Control { protected override void OnParentChanged(EventArgs e) { if (Parent != null && !(Parent is SplitterPanel)) throw new Exception("You can add this control only to a SplitterContainer."); base.OnParentChanged(e); } } public class MyControlDesigner : ControlDesigner { public override bool CanBeParentedTo(IDesigner parentDesigner) { if (parentDesigner.Component is SplitterPanel) return true; else return false; } } public class MyControlToolBoxItem : ToolboxItem { protected override IComponent[] CreateComponentsCore(IDesignerHost host, System.Collections.IDictionary defaultValues) { if (defaultValues.Contains("Parent")) { var parent = defaultValues["Parent"]; if (parent != null && parent is SplitterPanel) return base.CreateComponentsCore(host, defaultValues); } var svc = (IUIService)host.GetService(typeof(IUIService)); if (svc != null) svc.ShowError("You can drop this control only over a SplitterContainer."); return null; } }