Ширина и высота среды выполнения Usercontrol

Я пытаюсь создать простой пользовательский элемент управления (, а не WPF )в VS2008, который фактически представляет собой SplitContainerс кнопкой в ​​Panel1, которая при нажатии переключает Panel2Collapsedи изменяет размер элемента управления до размера Panel1.

Вот костяк элемента управления.:

private int _openHeight;
private int _closedHeight;

public MyUserControl(bool open)
{
  InitializeComponent();

  _openHeight = this.Height;
  _closedHeight = splitContainer1.SplitterDistance;
  Open = open;  
}    

private bool _open;
private bool Open
{
  get { return _open; }
  set 
  { 
    _open = value;
    splitContainer1.Panel2Collapsed = !_open;
    this.Height = _open ? _openHeight : _closedHeight;
  }
}

private void button1_Click(object sender, EventArgs e)
{
  Open = !Open;
}

Проблема в том, что this.Heightв Runtime — это значение, которое элемент управления имеет в User Control Designer, а не то, что установлено во время разработки -в главном меню. конструктор форм.

Будем признательны за любую помощь.

ОБНОВЛЕНИЕ

Следуя решению Лукаса, этот способ означает, что _openHeight устанавливается только один раз, что приводит к желаемому эффекту:

private int? _openHeight;
private int _closedHeight;

public MyUserControl(bool open)
{
  InitializeComponent();

  //the _closedHeight doesn't change so can be defined in the constructor
  _closedHeight = splitContainer1.SplitterDistance;

  //set value
  Open = open;  

  this.SizeChanged += new EventHandler(MyUserControl_SizeChanged);
  this.Load += new EventHandler(MyUserControl_Load);
}    

void MyUserControl_SizeChanged(object sender, EventArgs e)
{
  //this event is called BEFORE the _Load event so gets the height set in the designer
  //  and not any changes at run time (e.g. when you collapse the control)

  if (_openHeight == null)
    _openHeight = this.Height;
}

private bool _open;
private bool Open
{
  get { return _open; }
  set 
  { 
    _open = value;

    if (_open)
    {
      //sets height only if it has been initialized
      if (_openHeight != null)
        this.Height = (int)_openHeight;
    }
    else
    {
      this.Height = (int)_closedHeight;
    }
  }
}

void MyUserControl_Load(object sender, EventArgs e)
{
  //now that control is loaded, set height
  Open = Open;
}

private void button1_Click(object sender, EventArgs e)
{
  Open = !Open;
}
6
задан dav_i 27 April 2012 в 08:48
поделиться