Добавить вертикальную полосу прокрутки на панель

#c# #.net #winforms #scroll

#c# #.net #winforms #прокрутка

Вопрос:

Я пытаюсь сделать Panel прокручиваемую, но только вертикально (так AutoScroll не получится, потому что дочерние элементы управления выходят за левый край и должны).

Итак, как это делается?

Комментарии:

1. Итак, вы хотите иметь только вертикальную прокрутку, когда это необходимо? Значит, установка Scrollbars свойства на Vertical не будет работать?

2. @debracey Scrollbars В моем Panel нет никакого свойства, вызываемого, и оно не отображается в Intellisense. Я видел, как другие люди говорили об этом, поэтому я думаю, что это существует, но я просто делаю это неправильно. Я получаю эту ошибку для этой строки: panel1.Scrollbars = ScrollBars.Vertical; 'System.Windows.Forms.Panel' does not contain a definition for 'Scrollbars' and no extension method 'Scrollbars' accepting a first argument of type 'System.Windows.Forms.Panel' could be found (are you missing a using directive or an assembly reference?)

3. @debracey Я использую VS 2010 Pro.

Ответ №1:

Попробуйте это вместо «только» прокрутки по вертикали.
(для автоматической прокрутки должно быть значение false, прежде чем оно примет изменения)

 mypanel.AutoScroll = false;
mypanel.HorizontalScroll.Enabled = false;
mypanel.HorizontalScroll.Visible = false;
mypanel.HorizontalScroll.Maximum = 0;
mypanel.AutoScroll = true;
  

Комментарии:

1. Очень хороший момент для напоминания о том, что AutoScroll должно быть установлено значение false, спасибо

Ответ №2:

Предполагая, что вы используете winforms, компоненты панели по умолчанию не предлагают вам способа отключить компоненты горизонтальной прокрутки. Обходной путь — отключить автоматическую прокрутку и добавить полосу прокрутки самостоятельно:

 ScrollBar vScrollBar1 = new VScrollBar();
vScrollBar1.Dock = DockStyle.Right;
vScrollBar1.Scroll  = (sender, e) => { panel1.VerticalScroll.Value = vScrollBar1.Value; };
panel1.Controls.Add(vScrollBar1);
  

Подробное обсуждение здесь.

Комментарии:

1. Я действительно не хочу делать этот «взлом». Как я могу сделать это вручную с VScrollBar компонентом?

2. @Teoman этот пример не помогает, я могу сделать это с помощью конструктора форм. Какова формула для определения того, какими должны быть максимальные / минимальные значения полосы прокрутки, как мне смещать элементы управления внутри панели при прокрутке полосы прокрутки вниз и т.д.?

3. Все, что вам нужно, это синхронизировать VerticalScroll.Value свойства с Scroll событием. Обновлен код. Обратите внимание, что для получения эффекта прокрутки некоторые элементы должны выходить за нижний край панели (т. Е. должны быть некоторые невидимые элементы для прокрутки).

4. @Teoman Как мне изменить размер ручки на полосе прокрутки по мере того, как снизу становится все больше или меньше «переполняемых» объектов? И я только что попробовал код, очень похожий на ваш, и когда я прокручиваю вниз, все сильно дергается и не прокручивается (хотя в этом случае есть что прокручивать).

5. Это может помочь: social.msdn.microsoft.com/Forums/en-IE/winforms/thread /…

Ответ №3:

Panel обладает AutoScroll свойством. Просто установите для этого свойства значение True , и панель автоматически добавит полосу прокрутки при необходимости.

Комментарии:

1. OP специально упомянул, что AutoScroll это не решение

Ответ №4:

AutoScroll это действительно решение! Вам просто нужно установить AutoScrollMargin на 0, 1000 или что-то вроде этого, затем использовать это для прокрутки вниз и добавления кнопок и элементов там!

Комментарии:

1. пожалуйста, более контекстуализируйте свой ответ, покажите пример кода и т. Д

Ответ №5:

Ниже приведен код, который реализует пользовательскую вертикальную полосу прокрутки. Важная деталь здесь заключается в том, чтобы определить, когда требуется полоса прокрутки, путем вычисления того, сколько места занимают элементы управления, которые вы добавляете на панель.

 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();
  

Ответ №6:

3 шага:

1- просто установите для свойства AutoScroll значение true

2- в форме load() добавьте следующее:

    my Panel Vertical Scroll Maximum = 10000     
  

3- после добавления элементов управления моей панелью (item) добавьте следующее:
Аннулировать();
Готово!

Ответ №7:

Добавьте в код стиля вашей панели что-то вроде этого:

 <asp:Panel ID="myPanel" runat="Server" CssClass="myPanelCSS" style="overflow-y:auto; overflow-x:hidden"></asp:Panel>
  

Комментарии:

1. OP спросил о Winforms (это в тегах) Я думаю, именно поэтому вы проголосовали против.