Рейтинг:
1
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
Ладно, это работает так, как я хочу, но почему-то очень сзади через грудь в глаз (неловко)