Member 13814072 Ответов: 2

Как сделать так, чтобы стандартная полоса прокрутки панели исчезла?


Эй

На моей форме есть панель с различным количеством кнопок. Они все расположены в ряд и все настроены на стыковку сверху. Поскольку мне не нравится дизайн включенных полос прокрутки и отсутствие возможности изменить цвет, я создал свою собственную полосу прокрутки, которая отлично работает. Проблема в том, что для того, чтобы он работал, AutoScroll должен быть установлен в true. Теперь, когда суммированная высота содержимого превышает высоту панели, автоматически появляется стандартная полоса прокрутки, и я не могу от нее избавиться.

Итак, вот мой вопрос. Как я могу сделать так, чтобы полоса прокрутки исчезла?

Что я уже пробовал:

Я перепробовал все комбинации как например

panel_Playlists.AutoScroll = false;
panel_Playlists.VerticalScroll.Enabled = false;
panel_Playlists.VerticalScroll.Visible = false;
panel_Playlists.AutoScroll = true;

2 Ответов

Рейтинг:
1

Wendelius

Один из способов-позвонить ShowScrollBar непосредственно из user32.dll.

Взгляните на это Проблема со скрытием вертикальной полосы прокрутки в панели управления.[^]


Member 13814072

Он работает только на 50%. Если я ничего не буду делать, полоса прокрутки тоже не будет видна. Однако если я прокручу и изменю panel.VerticalScroll.Значение, полоса прокрутки будет отображаться снова, пока я не остановлюсь

Wendelius

После установки значения просто вызовите функцию еще раз. Вызов функции не обязательно должен быть в WndProc. Рассмотрим следующий пример

      private void button1_Click(object sender, EventArgs e) {
         panel1.VerticalScroll.Value = panel1.VerticalScroll.Value + 1;
         ShowScrollBar(panel1.Handle, (int)ScrollBarDirection.SB_VERT, false);
      }

      private void Form1_Activated(object sender, EventArgs e) {
         ShowScrollBar(panel1.Handle, (int)ScrollBarDirection.SB_VERT, false);
      }

Member 13814072

теперь оно появляется, исчезает, появляется... каждый раз, когда я перемещаю мышь, перетаскивая scrollthump ;)

Wendelius

Это довольно странно. Я сделал небольшой тест с приведенным выше кодом, и все воткнулось просто отлично.

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

Member 13814072

Я не использую событие прокрутки. Я использую событие OnValueChanged, которое я создал сам и которое вызывается, когда значение полосы прокрутки изменяется/устанавливается. Единственная позиция, где я параметр автопрокрутка в метод initializecomponent()

Member 13814072

кроме того после вызова функции ShowScrollBar изменение значения verticalscroll больше не имеет эффекта прокрутки

Рейтинг:
1

Alan N

Общее решение этой проблемы требует вложенных панелей. Внутренняя панель имеет возможность изменять размер в соответствии с ее содержимым и не показывает полос прокрутки. Внешняя панель имеет свойство AutoSize значение false и Автопрокрутка ложные. Изменяя расположение внутренней панели, ее можно перемещать (прокручивать) в пределах внешней панели.

Это и есть идея

Panel outerPanel = new Panel();
outerPanel.AutoSize = false;
outerPanel.AutoScroll = false;
// For testing make the bounds very obvious
outerPanel.BackColor = Color.Red;
outerPanel.BorderStyle = BorderStyle.FixedSingle;

Panel innerPanel = new Panel();
innerPanel.Parent = outerPanel;
innerPanel.AutoSize = true;
innerPanel.AutoSizeMode = AutoSizeMode.GrowAndShrink;
innerPanel.AutoScroll = false;
innerPanel.BorderStyle = BorderStyle.FixedSingle;
innerPanel.BackColor = Color.Blue;

// Scroll down a bit, right a bit
innerPanel.Location = new Point(-50, -30);

Алан.


Member 13814072

Ладно, это работает так, как я хочу, но почему-то очень сзади через грудь в глаз (неловко)