web-dev-qa-db-fra.com

Comment redimensionnez-vous un formulaire pour qu'il s'adapte automatiquement à son contenu?

J'essaie d'implémenter le comportement suivant:

Sur un formulaire, il y a un tabcontrol. Sur cet onglet de commande, il y a une arborescence. Pour empêcher les barres de défilement d'apparaître, j'aimerais que le formulaire change de taille en fonction du contenu de l'arborescence lors de son premier affichage. 

Si l'arborescence a trop de nœuds pour être affichée sur la taille par défaut du formulaire, le formulaire doit changer sa taille afin qu'il n'y ait pas de barre de défilement verticale dans l'arborescence (jusqu'à une taille maximale autorisée par la taille de l'écran).

Ce que j'ai besoin de savoir, c'est s'il est possible d'obtenir ce comportement via les propriétés des contrôles. Je suis sûr que cela peut être réalisé en calculant et en paramétrant les tailles des éléments par programmation, mais j'aimerais savoir s'il existe un moyen d'y parvenir avec des paramètres tels que AutoSizeMode, etc.

[METTRE À JOUR]

C'est la première boîte de dialogue qu'un utilisateur de mon application voit: c'est une boîte de dialogue permettant de sélectionner la base de données à utiliser. C'est une liste de bases de données, avec un contrôle de tabulation, des bases, etc. Si la liste est trop longue, des barres de défilement apparaissent et un de mes collègues souhaite leur disparition.

28
Inno

Utilisez les propriétés AutoSize et AutoSizeMode.

http://msdn.Microsoft.com/en-us/library/system.windows.forms.form.autosize.aspx

Un exemple:

private void Form1_Load(object sender, EventArgs e)
{
    // no smaller than design time size
    this.MinimumSize = new System.Drawing.Size(this.Width, this.Height);

    // no larger than screen size
    this.MaximumSize = new System.Drawing.Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, (int)System.Windows.SystemParameters.PrimaryScreenHeight);

    this.AutoSize = true;
    this.AutoSizeMode = AutoSizeMode.GrowAndShrink;

    // rest of your code here...
}
26
Derek Johnson

En utilisant les différentes propriétés de dimensionnement (Dock, Ancre) ou les contrôles de conteneur (Panneau, TableLayoutPanel, FlowLayoutPanel, etc.), vous pouvez uniquement dicter la taille du contrôle externe aux contrôles internes. Mais rien dans le framework .Net ne permet de dicter la taille d’un conteneur en fonction de la taille du contrôle enfant. J'ai aussi manqué cela plusieurs fois et essayé la propriété AutoSize, mais cela n'a jamais fonctionné.

Donc, tout ce que vous pouvez faire, c’est essayer d’obtenir ces choses manuellement, désolé.

13
Oliver

De MSDN :

Pour optimiser la productivité, le Concepteur Windows Forms masque le fichier Propriété AutoSize pour la classe Form. Au moment du design, le formulaire se comporte comme si la propriété AutoSize était définie sur false, quel que soit son réglage réel. A l'exécution, pas de spécial le logement est fait, et la propriété AutoSize est appliquée en tant que spécifié par le paramètre de propriété.

10
serhio

Vous pouvez calculer la hauteur requise de TreeView en déterminant la hauteur d'un nœud, en le multipliant par le nombre de nœuds, puis en définissant la propriété MinimumSize du formulaire en conséquence.

// assuming the treeview is populated!
nodeHeight = treeview1.Nodes[0].Bounds.Height;

this.MaximumSize = new Size(someMaximumWidth, someMaximumHeight);

int requiredFormHeight = (treeView1.GetNodeCount(true) * nodeHeight);

this.MinimumSize = new Size(this.Width, requiredFormHeight);

NB Cela suppose cependant que l'arborescence arborescente1 est le seul contrôle du formulaire. Lorsque vous définissez la variable requiredFormHeight, vous devez prendre en compte d'autres contrôles et exigences de hauteur entourant l'arborescence, tels que le contrôle de tabulation que vous avez mentionné.

(Je serais cependant d'accord avec @jgauffin et j'évaluerais la logique qui sous-tend l'obligation de redimensionner un formulaire chaque fois qu'il est chargé sans le consentement de l'utilisateur - peut-être laisser l'utilisateur positionner et dimensionner le formulaire sans oublier que, à la place ??)

5
Stuart Helwig

Cela peut être utile . Il redimensionne un nouveau formulaire en contrôle utilisateur, puis ancre le contrôle utilisateur dans le nouveau formulaire

Form f = new Form();
MyUserControl muc = new MyUserControl();
f.ClientSize = muc.Size;
f.Controls.Add(muc);
muc.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
f.ShowDialog();
5
roger the dodger

Si vous essayez d’ajuster le contenu en fonction des formes, voici ce qui vous aidera. Cela m'aide à adapter le contenu du formulaire à chaque redimensionnement des formulaires.

this.contents.Size = nouvelle taille (this.ClientRectangle.Width, this.ClientRectangle.Height);

3
Lifestohack

Cette technique a résolu mon problème:

Sous forme parentale:

frmEmployee frm = new frmEmployee();
frm.MdiParent = this;
frm.Dock = DockStyle.Fill;
frm.Show();

Sous la forme enfant (événement Load):

this.WindowState = FormWindowState.Maximized;
3
Phantom Lord

J'ai utilisé ce code et cela fonctionne très bien

const int margin = 5;
        Rectangle rect = new Rectangle(
            Screen.PrimaryScreen.WorkingArea.X + margin,
            Screen.PrimaryScreen.WorkingArea.Y + margin,
            Screen.PrimaryScreen.WorkingArea.Width - 2 * margin,
            Screen.PrimaryScreen.WorkingArea.Height - 2 * (margin - 7));
        this.Bounds = rect;
0
MBARK T3ST3R