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. 🙂
Vous devez vous connecter pour publier un commentaire.
Vous lisez le contrôle de la Hauteur de la propriété dans son constructeur, ce qui signifie qu'il est probablement AVANT qu'il montre dans la forme. Le truc, c'est la taille semble être ajusté lorsque le contrôle doit être affiché dans le formulaire. Avant cela, c'est une valeur définie par le concepteur du contrôle, qui vous êtes maintenant.
La façon la plus simple de résoudre le problème est de lire les
Height
valeur lorsque vous êtes sûr que le contrôle a déjà été établi dans la forme c'est à dire que vous pouvez obteniropen
paramètre de contrôle du constructeur, ajouter une nouvelle méthode qui initialiseOpen
et_closedHeight
et de l'appeler dansLoad
cas de la forme.Quelque chose comme ceci:
Alors appel
AdjustControlSize
méthode à partir du formulaireLoad
événement.Solution avec le concours complet mécanisme
Vous pouvez également utiliser le contrôle de ses propres événements de lire le
Height
le cas échéant. De cette façon, vous n'avez pas à changer quoi que ce soit dans leForm
le code.Donc, dans ce cas, le code peut ressembler à ceci (je n'ai pas testé ce tout de même):
De cette façon, le contrôle peut se régler de lui-même chaque fois que sa taille est modifiée.