Как отключить горизонтальную полосу прокрутки в панели

У меня есть панель (Windows Forms), и я хочу отключить горизонтальную полосу прокрутки панелей. Я пробовал это:

HorizontalScroll.Enabled = false;

Но это не сработает.

Как я могу это сделать?

Ответ 1

Попробуйте реализовать этот способ, он будет работать на 100%

panel.HorizontalScroll.Maximum = 0;
panel.AutoScroll = false;
panel.VerticalScroll.Visible = false;
panel.AutoScroll = true;

Ответ 2

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

[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
}

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    ShowScrollBar(panel1.Handle, (int)ScrollBarDirection.SB_BOTH, false);
    base.WndProc(ref m);
}

В настоящее время я использую приведенный выше код, чтобы предотвратить показ его полос прокрутки сторонним UserControl. Они не подвергались каким-либо правильным способам их сокрытия.

Ответ 3

Я думаю, что у вас такая проблема, потому что для свойства AutoScroll вашей панели установлено значение true. Я сделал тестовое решение (.NET 3.5) и обнаружил следующее:

Если вы попробуете это:

panel.AutoScroll = true;
panel.HorizontalScroll.Enabled = false;
panel.HorizontalScroll.Visible = false;

HorizontalScroll.Enabled и .Visible не изменяются на false (при условии, что на панели есть элементы управления внутри этой причины, поскольку автоскар для отображения горизонтальной полосы прокрутки). Кажется, что вы должны отключить AutoScroll, чтобы иметь возможность изменять эти свойства вручную.

Ответ 4

У меня был такой же тип проблемы, когда горизонтальная прокрутка появлялась, когда AutoScroll = true, она появилась только при появлении вертикальной полосы прокрутки. Я, наконец, понял, что я удалил прокладку с панели и добавив 20 обратно в правое заполнение, что позволило отобразить вертикальную полосу прокрутки и не показывать горизонтальную.

Ответ 5

Управляемый код на С++, чтобы скрыть панель HScroll:

// Hide horizontal scroll bar
HWND h = static_cast<HWND> (this->Handle.ToPointer());
ShowScrollBar(h, SB_HORZ, false);

Ответ 6

Другим решением, которое, казалось, было единственным, с которым я мог работать, было довольно хакерское:

        foreach (UserControl control in ListPanel.Controls)
        {
            if (ListPanel.VerticalScroll.Visible)
                control.Width = ListPanel.Width - 23;
            else
                control.Width = ListPanel.Width-5;
        }

который я вызываю в своем событии OnResize

Ответ 7

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

private void txtOutput_TextChanged(object sender, EventArgs e)
    {
        // Set the scrollbars to none. If the content fits within textbox maximum size no scrollbars are needed. 
        txtOutput.ScrollBars = ScrollBars.None;

        // Calculate the width and height the text will need to fit inside the box
        Size size = TextRenderer.MeasureText(txtOutput.Text, txtOutput.Font);

        // Size the box accordingly (adding a bit of extra margin cause i like it that way)
        txtOutput.Width = size.Width + 20;
        txtOutput.Height = size.Height + 30;


        // If the box would need to be larger than maximum size we need scrollbars

        // If height needed exceeds maximum add vertical scrollbar
        if (size.Height > txtOutput.MaximumSize.Height)
        {

            txtOutput.ScrollBars = ScrollBars.Vertical;

            // If it also exceeds maximum width add both scrollbars 
            // (You can't add vertical first and then horizontal if you wan't both. You would end up with just the horizontal) 
            if (size.Width > txtOutput.MaximumSize.Width)
            {
                txtOutput.ScrollBars = ScrollBars.Both;
            }
        }

        // If width needed exceeds maximum add horosontal scrollbar 
        else if (size.Width > txtOutput.MaximumSize.Width)
        {
            txtOutput.ScrollBars = ScrollBars.Horizontal;
        }
    }