web-dev-qa-db-fra.com

C #: comment obtenir un contrôle utilisateur pour se redimensionner correctement

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.

22
Svish

Merci pour toutes les suggestions. Cette fois, la solution a semblé définir AutoSize sur true pour le FlowLayoutPanelet 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. ..

11
Svish

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.

5
Mickel

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.

2
Bryan Menard

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.

0
benPearce

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.

0
Surya