Как заставить вертикальную полосу прокрутки всегда быть видимой из AutoScroll в WinForms? - PullRequest
9 голосов
/ 01 января 2012

Использование VS2010 и .NET 4.0 с C # и WinForms:

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

Так что это как гибридная автопрокрутка. Я пытался использовать VScrollBars, но не могу понять, где их разместить, чтобы сделать эту работу.

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

По сути, это похоже на веб-браузер. Однако перерисовка элементов управления занимает много времени (это формы со многими полями, кнопками и т. Д. Внутри групп в сетке на панели: P

Так или иначе, когда автопрокрутка включает вертикальную полосу прокрутки, требуется перерисовать окно. Я бы ВСЕГДА показывал вертикальную полосу прокрутки, как указано выше (с функцией включения / выключения).

Если у кого-то есть помощь, я прочитал много постов на тему автопрокрутки, но никто не спросил, что я спрашиваю, и я не могу найти решение.

Ответы [ 4 ]

8 голосов
/ 09 октября 2014

C # Версия ответа компетентного_Тека

using System.Runtime.InteropServices; 

public class MyUserControl : UserControl
{
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool ShowScrollBar(IntPtr hWnd, int wBar, bool bShow);

    private enum ScrollBarDirection
    {
        SB_HORZ = 0,
        SB_VERT = 1,
        SB_CTL = 2,
        SB_BOTH = 3
    }

    public MyUserControl()
    {
        InitializeComponent();
        ShowScrollBar(this.Handle, (int) ScrollBarDirection.SB_VERT, true);
    }
}
4 голосов
/ 01 января 2012

Вы можете использовать функцию автоматической прокрутки панели, вам просто нужно отправить ей сообщение Windows, чтобы показать вертикальную полосу прокрутки:

<DllImport("user32.dll")> _
Public Shared Function ShowScrollBar(ByVal hWnd As System.IntPtr, ByVal wBar As Integer, ByVal bShow As Boolean) As Boolean
End Function

Private Const SB_VERT As Integer = 1


Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ShowScrollBar(Panel1.Handle, SB_VERT, True)
End Sub

Полоса прокрутки будет отображаться и выглядеть так, как будто она можетпрокручиваться, но он ничего не сделает, пока не будет готов к прокрутке.Если вы отключите его, он не будет автоматически повторно включен, так что это, вероятно, лучший подход.

Кроме того, чтобы повысить производительность при изменении размера, вы можете вызвать SuspendLayout напанель перед обновлением и ResumeLayout по завершении.

2 голосов
/ 18 августа 2016

Для меня сработало переопределение вызова CreateParams и включение стиля WS_VSCROLL.

public class VerticalFlowPanel : FlowLayoutPanel
{
    protected override CreateParams CreateParams
    {
        get
        {
            var cp = base.CreateParams;
            cp.Style |= 0x00200000; // WS_VSCROLL
            return cp;
        }
    }
}

Логика AutoScroll теперь будет корректировать границы прокрутки, даже не скрывая полосу прокрутки.

1 голос
/ 12 августа 2016

Вот что решило это для меня.Мой случай таков, что у меня есть панель, зажатая между тремя другими панелями без какой-либо степени свободы в любом направлении.Мне нужно было, чтобы эта панель была настолько большой, чтобы вся структура выходила за пределы экрана 1920x1080.Решение на самом деле очень простое.Для панели, которой нужны полосы прокрутки, установите для свойства AutoScroll значение true.Затем добавьте еще один элемент управления в крайнее правое положение (внизу справа).Элемент управления, который я выбрал, - это ярлык, который я сделал невидимым .... И это все.Теперь моя панель занимает ограниченную область, но я могу прокрутить до нужного мне размера и использовать его для нужного мне размера.Если вам нужны только горизонтальные полосы прокрутки, добавьте невидимый элемент управления снаружи слева, а для вертикали - только внизу.

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

...