Usercontrol d'exécution de la largeur et de la hauteur

Je suis en train de créer un Contrôle Utilisateur simple (pas de WPF) dans VS2008 qui est en fait un SplitContainer avec un bouton dans Panel1, qui lorsqu'il est pressé, on bascule le Panel2Collapsed propriété et redimensionne le contrôle de la taille de Panel1.

Voici le squelette du contrôle:

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;
}

Le problème est que this.Height dans Runtime est la valeur à laquelle le contrôle est dans le Contrôle de l'Utilisateur Concepteur, plutôt que de ce qui est défini au moment de la Conception dans le formulaire principal concepteur du.

Toute aide serait grandement appréciée.

Mise à JOUR

La suite de Lucas solution, de cette façon, les _openHeight est qu'une seule fois, résultant de l'effet désiré:

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;
}
  • A la solution que j'ai proposé a fonctionné pour vous?
  • Viens de tester votre deuxième solution, et avec un peu de modification, il fonctionne. Est-ce la bonne pratique de mettre à jour votre réponse avec mes modifié solution?
  • Juste faire na mise à Jour dans votre question-tête et de le mettre à jour avec la réponse que vous avez et une certaine description :).
  • J'ai vu que Vous l'avez édité ma réponse, mais si vous voulez je peux les jeter et de Vous laisser de mise à jour de la question et de décrire votre propre version basée sur ma réponse :).
  • Bon, rejetez loin et je doit faire une mise à jour sur la question. 🙂
InformationsquelleAutor dav_i | 2012-04-25