2009-08-31 6 views
20

j'ai un UserControl qui consiste en un Label (Top), un FlowLayoutPanel (remplissage, flux TopDown et sans enveloppe) et un Panel (en bas). Le contrôle utilisateur crée un certain nombre de contrôles, basé sur une liste de choses qu'il obtient, et les ajoute au FlowLayoutPanel.C#: Comment obtenir un contrôle utilisateur à correctement la taille auto se

Comment est-ce que je peux obtenir ce UserControl pour se redimensionner correctement de sorte que le FlowLayoutPanel n'ait aucune 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 gros ou il est écrasé à presque rien.

Répondre

11

Merci pour toutes les suggestions. La solution cette fois semblait AutoSize à true pour les 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 tout à fait comprendre pour le moment, mais je suppose que cela devrait être une question distincte ...

+0

Avez-vous réussi à résoudre la dernière partie? – Macke

+0

@Macke C'était comme il y a 6 ans, donc je n'en ai aucune idée, hehe. Peut-être rechercher des questions posées par moi au moment où j'ai posé cette question: P – Svish

5

Vous pouvez utiliser la propriété Anchor et Dock de UserControl pour définir des options afin 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 que vous les ancrez 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 également définir anchors/dock sur UserControl également.

+3

Cela je sais, mais je ne veux pas que le contrôle redimensionne en fonction de leur parent. Je veux qu'il s'agrandisse ou se rétrécisse afin qu'il soit juste assez grand pour couvrir le contenu du 'FlowLayoutPanel' sans qu'il ne soit doté de barres de défilement ou de découpage de contenu. – Svish

0

J'ai trouvé que la meilleure façon de résoudre c'était d'utiliser un code en cas ControlAdded sur le FlowLayoutPanel pour régler la hauteur du panneau (la hauteur parce que vous utilisez le flux TopDown) soit:

e.Control.Location.Y + e.Control.Height + some margin 

et de définir la propriété AutoSize sur la commande usercontrol à True.

Vous devrez également faire certaines 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 remplaçant la méthode ControlAdded.

2

Envelopper le FlowLayoutPanel dans un TableLayoutPanel permettra un comportement autosize 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, lors de l'utilisation que UserControl, il est possible que vous aurez besoin de l'envelopper dans un TableLayoutPanel en utilisant une ligne ou une colonne AutoSize.

Surveillez SplitContainers car ils ont souvent tendance à déséquilibrer les comportements autosize.

0

sur l'ajout d'un contrôle à l'FlowLayout vous pouvez redimensionner les contrôles déjà ajoutés à la taille requise sans obtenir les barres de défilement pour la mise en page flux panel.l

Questions connexes