Собственный компонент с панелью

Я хочу создать свой собственный компонент, состоящий из двух других панелей. Один из них имеет фиксированное содержимое (например, кнопки управления и т. д.), а другой — стандартную панель, куда я могу добавить другие компоненты в дизайнере (VS2008). Я знаю, что мне нужно создать UserControl, где я могу разместить свои две панели. Затем я хочу вставить свой компонент в форму. Но я не знаю, как создать поведение, при котором я могу добавлять другие компоненты (например, кнопки, метки и т. д.) только во вторую панель моего компонента. Может ли кто-нибудь помочь мне с созданием этого компонента?

Спасибо. Адам.


person Adam    schedule 14.04.2010    source источник


Ответы (2)


Вот пример (фрагмент рабочего кода):

  [Designer(typeof(NavigationalUserControl.Designer))]
  public partial class NavigationalUserControl : UserControl
  {
    class Designer : ControlDesigner 
    {
      public override void Initialize(IComponent component)
      {
        base.Initialize(component);
        var nc = component as NavigationalUserControl;
        EnableDesignMode(nc.panel2, "ContainerPanel"); 
        EnableDesignMode(nc.bottomPanel, "BottomPanel");
      }
    }

    // rest of normal class
  }
person leppie    schedule 14.04.2010
comment
В этом решении есть еще одна проблема. Поведение компонента в режиме дизайнера правильное, но всякий раз, когда я добавляю какой-либо компонент в панель контейнера и запускаю программу, компонент исчезает. Кажется, дизайнер не добавляет компонент в раздел InitComponent. Есть ли способ это исправить? Спасибо. - person Adam; 14.04.2010
comment
@Adam: Просто добавьте его в конструктор. Наличие его в разделе InitComponent может привести к его потере. - person leppie; 14.04.2010
comment
Это означает, что если я хочу добавить кнопку в панель контейнера, мне придется вручную добавить в конструктор что-то вроде этого: panel2.Controls.Add(button1); ? Нет ли лучшего способа? Я думаю, что я делаю что-то не так. :-( - person Adam; 14.04.2010
comment
@Adam: Нет, это будет добавлено в InitComponent, а затем из дизайнера. Если он постоянный, то добавьте его в конструктор. - person leppie; 14.04.2010

Я нашел правильное решение (надеюсь). Я добавил в свой UserControl свойство, которое возвращает панель содержимого с этим конкретным атрибутом:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Panel PanelContent
{
   get { return this.panel2; }
}

Леппи спасибо за помощь

person Adam    schedule 14.04.2010