J'essaie de faire défiler un Panel
, mais uniquement verticalement (donc AutoScroll
ne fonctionnera pas car les contrôles enfants vont au-delà du bord gauche et doivent le faire).
Alors, comment cela se fait-il?
En supposant que vous utilisiez winforms, les composants de panneau par défaut ne vous offrent pas un moyen de désactiver les composants de défilement horizontal. Une solution de contournement consiste à désactiver le défilement automatique et à ajouter une barre de défilement vous-même:
ScrollBar vScrollBar1 = new VScrollBar();
vScrollBar1.Dock = DockStyle.Right;
vScrollBar1.Scroll += (sender, e) => { panel1.VerticalScroll.Value = vScrollBar1.Value; };
panel1.Controls.Add(vScrollBar1);
Discussion détaillée ici .
Essayez ceci à la place pour le défilement vertical "seulement".
(le défilement automatique doit être faux pour accepter les modifications)
mypanel.AutoScroll = false;
mypanel.HorizontalScroll.Enabled = false;
mypanel.HorizontalScroll.Visible = false;
mypanel.HorizontalScroll.Maximum = 0;
mypanel.AutoScroll = true;
Panel
a une propriété AutoScroll
. Définissez cette propriété sur True
et le panneau ajoutera automatiquement une barre de défilement si nécessaire.
Vous trouverez ci-dessous le code qui implémente une barre de défilement verticale personnalisée. Le détail important ici est de savoir quand la barre de défilement est nécessaire en calculant la quantité d’espace utilisé par les contrôles que vous ajoutez au panneau.
panelUserInput.SuspendLayout();
panelUserInput.Controls.Clear();
panelUserInput.AutoScroll = false;
panelUserInput.VerticalScroll.Visible = false;
// here you'd be adding controls
int x = 20, y = 20, height = 0;
for (int inx = 0; inx < numControls; inx++ )
{
// this example uses textbox control
TextBox txt = new TextBox();
txt.Location = new System.Drawing.Point(x, y);
// add whatever details you need for this control
// before adding it to the panel
panelUserInput.Controls.Add(txt);
height = y + txt.Height;
y += 25;
}
if (height > panelUserInput.Height)
{
VScrollBar bar = new VScrollBar();
bar.Dock = DockStyle.Right;
bar.Scroll += (sender, e) => { panelUserInput.VerticalScroll.Value = bar.Value; };
bar.Top = 0;
bar.Left = panelUserInput.Width - bar.Width;
bar.Height = panelUserInput.Height;
bar.Visible = true;
panelUserInput.Controls.Add(bar);
}
panelUserInput.ResumeLayout();
// then update the form
this.PerformLayout();
AutoScroll
est vraiment la solution! Il vous suffit de définir AutoScrollMargin
sur 0, 1000
ou quelque chose comme ça, utilisez-le pour faire défiler l'écran et ajouter des boutons et des éléments!