Я проектирую простое управление экспандером.
Я получил от UserControl, нарисовал внутренние элементы управления, построил, запустил; все ок.
Поскольку внутренний элемент управления - это панель, я хотел бы использовать его в качестве контейнера во время разработки. На самом деле я использовал атрибуты:
[Designer(typeof(ExpanderControlDesigner))]
[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))]
Отлично, говорю. Но это не так ...
В результате я могу использовать его как контейнер во время разработки, но:
- Добавленные элементы управления возвращают внутренние элементы управления, уже встроенные в пользовательский элемент управления
- Даже если я нажму верхний элемент управления, добавленный во время разработки, во время выполнения он снова вернется к элементам управления, встроенным в пользовательский элемент управления
- Я не могу ограничить область контейнера во время разработки в область Panel
Чего мне не хватает? Вот код для полноты ... почему этот фрагмент кода не работает?
[Designer(typeof(ExpanderControlDesigner))]
[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))]
public partial class ExpanderControl : UserControl
{
public ExpanderControl()
{
InitializeComponent();
....
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
internal class ExpanderControlDesigner : ControlDesigner
{
private ExpanderControl MyControl;
public override void Initialize(IComponent component)
{
base.Initialize(component);
MyControl = (ExpanderControl)component;
// Hook up events
ISelectionService s = (ISelectionService)GetService(typeof(ISelectionService));
IComponentChangeService c = (IComponentChangeService)GetService(typeof(IComponentChangeService));
s.SelectionChanged += new EventHandler(OnSelectionChanged);
c.ComponentRemoving += new ComponentEventHandler(OnComponentRemoving);
}
private void OnSelectionChanged(object sender, System.EventArgs e)
{
}
private void OnComponentRemoving(object sender, ComponentEventArgs e)
{
}
protected override void Dispose(bool disposing)
{
ISelectionService s = (ISelectionService)GetService(typeof(ISelectionService));
IComponentChangeService c = (IComponentChangeService)GetService(typeof(IComponentChangeService));
// Unhook events
s.SelectionChanged -= new EventHandler(OnSelectionChanged);
c.ComponentRemoving -= new ComponentEventHandler(OnComponentRemoving);
base.Dispose(disposing);
}
public override System.ComponentModel.Design.DesignerVerbCollection Verbs
{
get
{
DesignerVerbCollection v = new DesignerVerbCollection();
v.Add(new DesignerVerb("&asd", new EventHandler(null)));
return v;
}
}
}
Я нашел много ресурсов ( Взаимодействие , разработан , ограниченная область ), но ничего не было полезным для оперативности ...
На самом деле есть хитрость, поскольку классы System.Windows.Forms могут создаваться (как обычно) и иметь правильное поведение во время выполнения (например, TabControl).