J'ai un UserControl
qui se compose d'un Label
(en haut), d'un FlowLayoutPanel
(remplissage, flux TopDown et pas de retour à la ligne) et d'un Panel
(en bas) . Le contrôle utilisateur crée un certain nombre de contrôles, sur la base d'une liste de choses qu'il obtient, et les ajoute au FlowLayoutPanel
.
Comment puis-je obtenir ce UserControl
pour qu'il se redimensionne correctement afin que le FlowLayoutPanel
n'ait pas de barre de défilement? J'ai essayé d'utiliser diverses combinaisons de AutoSize
et AutoSizeMode
sur le FlowLayoutPanel
et le UserControl
lui-même, mais je n'arrive pas à le faire fonctionner. Soit je me retrouve avec quelque chose qui ne se redimensionne pas du tout, soit il ne devient pas assez grand ou il est réduit à presque rien.
Merci pour toutes les suggestions. Cette fois, la solution a semblé définir AutoSize
sur true
pour le FlowLayoutPanel
et le UserControl
lui-même.
Maintenant, comment obtenir le formulaire qui contiendra ce UserControl
ainsi que d'autres contrôles, que je ne peux pas vraiment comprendre pour le moment, mais je suppose que cela devrait être une question distincte. ..
Vous pouvez utiliser la propriété Anchor- et Dock de UserControl pour définir des options de sorte que les bords de votre contrôle soient "collés" à d'autres parties de votre interface utilisateur. Lorsque l'interface utilisateur sera redimensionnée, votre contrôle suivra!
Si vous utilisez des ancres et un ancrage sur tous les contrôles de votre contrôle utilisateur et que vous les définissez pour ancrer les bords du contrôle, les contrôles seront redimensionnés avec UserControl et vous pouvez désormais définir des ancres/ancrage pour UserControl également.
Envelopper le FlowLayoutPanel
dans un TableLayoutPanel
permettra un comportement de redimensionnement automatique correct.
Votre UserControl
devrait ressembler à ceci:
UserControl
TableLayoutPanel (Dock-Fill)
Row1 : Label
Row2 : FlowLayoutPanel (Panel:Dock-Fill AND AutoSize, Row:AutoSize)
Row3 : Panel
Encore une fois, lorsque vous utilisez ce UserControl
, il est possible que vous deviez l'envelopper dans une TableLayoutPanel
en utilisant une ligne ou une colonne AutoSize
.
Surveillez SplitContainers
car ils déséquilibrent souvent les comportements de redimensionnement automatique.
J'ai trouvé que la meilleure façon de résoudre ce problème était d'utiliser du code dans l'événement ControlAdded sur le flowlayoutpanel pour régler la hauteur du panneau (la hauteur parce que vous utilisiez le flux TopDown) pour être:
e.Control.Location.Y + e.Control.Height + some margin
et pour définir la propriété AutoSize sur le contrôle utilisateur lui-même sur True.
Vous auriez également besoin de faire quelques suggestions d'ancrage et d'ancrage selon la réponse de Mickel.
Cette fonctionnalité peut être encapsulée dans votre propre contrôle hérité de FlowLayoutPanel et remplacer la méthode ControlAdded.
Lors de l'ajout d'un contrôle à l'écoulement, vous pouvez redimensionner les contrôles déjà ajoutés à la taille requise sans obtenir les barres de défilement pour le panneau de disposition de flux.