#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 (это в тегах) Я думаю, именно поэтому вы проголосовали против.