Вам необходимо сделать следующее:
- Для вашего пользовательского элемента управления вам необходимо создать новый дизайнер, который активирует внутреннюю панель во время разработки, вызвав метод
EnableDesignMode
.
- Для внутренней панели вам необходимо создать дизайнер, который отключает перемещение, изменение размера и удаляет некоторые свойства из дизайнера.
- Вы должны зарегистрировать дизайнеров.
Пример
Вы можете прочитать сообщение в блоге по этой теме здесь и клонировать или загрузить рабочий пример:
Код
Вот коды для различных элементов решения.
Ваш пользовательский элемент управления
[Designer(typeof(MyUserControlDesigner))]
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
TypeDescriptor.AddAttributes(this.panel1,
new DesignerAttribute(typeof(MyPanelDesigner)));
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Panel ContentsPanel
{
get { return panel1; }
}
}
Конструктор внутренней панели
public class MyPanelDesigner : ParentControlDesigner
{
public override SelectionRules SelectionRules
{
get
{
SelectionRules selectionRules = base.SelectionRules;
selectionRules &= ~SelectionRules.AllSizeable;
return selectionRules;
}
}
protected override void PostFilterAttributes(IDictionary attributes)
{
base.PostFilterAttributes(attributes);
attributes[typeof(DockingAttribute)] =
new DockingAttribute(DockingBehavior.Never);
}
protected override void PostFilterProperties(IDictionary properties)
{
base.PostFilterProperties(properties);
var propertiesToRemove = new string[] {
"Dock", "Anchor", "Size", "Location", "Width", "Height",
"MinimumSize", "MaximumSize", "AutoSize", "AutoSizeMode",
"Visible", "Enabled",
};
foreach (var item in propertiesToRemove)
{
if (properties.Contains(item))
properties[item] = TypeDescriptor.CreateProperty(this.Component.GetType(),
(PropertyDescriptor)properties[item],
new BrowsableAttribute(false));
}
}
}
Конструктор для вашего пользовательского элемента управления
public class MyUserControlDesigner : ParentControlDesigner
{
public override void Initialize(IComponent component)
{
base.Initialize(component);
var contentsPanel = ((MyUserControl)this.Control).ContentsPanel;
this.EnableDesignMode(contentsPanel, "ContentsPanel");
}
public override bool CanParent(Control control)
{
return false;
}
protected override void OnDragOver(DragEventArgs de)
{
de.Effect = DragDropEffects.None;
}
protected override IComponent[] CreateToolCore(ToolboxItem tool, int x,
int y, int width, int height, bool hasLocation, bool hasSize)
{
return null;
}
}
Я не знаком с пользовательскими элементами управления, но не можете ли вы просто поместить панель в область, где вы хотите, чтобы пользователь мог размещать элементы управления? Возможно, вам также нужно изменить свойство
modifier
этой панели@GuidoG - к сожалению, нет :(. Модификатор работает нормально при наследовании, но, насколько я пытался, нет способа сделать таким образом "редактируемость" компонента из пользовательского контроля.
это, вероятно, снова причина того, почему я никогда не использую пользовательские элементы управления, а наследую непосредственно от того, что мне нужно, или от Panel