如何在Panel中禁用水平滚动条

时间:2011-03-30 16:35:59

标签: c# winforms

我有一个面板(Windows窗体),我想禁用面板水平滚动条。我试过这个:

HorizontalScroll.Enabled = false;

但那不行。

我该怎么做?

11 个答案:

答案 0 :(得分:54)

尝试以这种方式实现,它将100%工作

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

答案 1 :(得分:20)

如果你想亵渎你的代码,你可以试试这个非常“hackish”的解决方案:

[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显示其滚动条。他们没有暴露任何隐藏它们的正确方法。

答案 2 :(得分:13)

我认为您遇到此问题是因为面板的AutoScroll属性设置为true。我制作了一个测试解决方案(.NET 3.5)并发现了以下内容:

如果您尝试这样做:

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

Horizo​​ntalScroll.Enabled和.Visible 更改为false(假设面板中有控件导致autoscroll显示水平滚动条)。您似乎必须禁用AutoScroll才能手动更改这些属性。

答案 3 :(得分:5)

我遇到了同样类型的问题,当AutoScroll = true时出现水平滚动,它只出现在垂直滚动条出现时。我终于想通了我从面板中删除了填充,并向右边填充添加了20,它允许垂直滚动条出现而不显示水平滚动条。

答案 4 :(得分:1)

Console.BufferHeight = 44;

设置缓冲区高度等于控制台的窗口高度。在我的程序中,我给出了静态高度,但是您也可以这样做:

Console.BufferHeiht = (Console.WindowHight - 1);

我认为应该可以。

答案 5 :(得分:0)

托管C ++代码以隐藏HScroll Bar:

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

答案 6 :(得分:0)

另一个解决方案似乎是我唯一可以解决的问题:

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

我在其OnResize事件中调用

答案 7 :(得分:0)

我正在寻找一个问题的答案,如何在需要时将滚动条添加到框中,并在不需要时将其删除。这是我为文本框提出的解决方案,具有允许的最大宽度和高度,为显示的文本调整大小。

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

答案 8 :(得分:0)

SuperOli的答案非常棒!

我更新了代码,因此可以在没有任何错误的情况下关闭表格。
我希望它也适合你。

List

答案 9 :(得分:0)

当从滚动模式切换到缩放至适合模式时,我遇到了一种可滚动priceFloat形式的故障。对于后一种模式,两个滚动条都应处于关闭状态。在大多数情况下,此模式更改都能正常工作,除非其中一个或两个滚动条都达到最大值,否则一个或另一个滚动条保持可见但被禁用。

哪些滚动条仍然可见,这似乎是随机的,因此Windows代码中必须存在某种竞争条件。

奇怪的是,Windows报告的UserControlClientRectangle的完整矩形,没有任何滚动条。这意味着Windows 认为滚动条不可见,但仍会随机显示一个或其他禁用的滚动条。

我通过将AutoScrollPosition移到(0,0)来解决此问题,然后再执行缩放到适合模式的切换。

UserControl

答案 10 :(得分:0)

在@Guesting提出的代码之后,我为面板控件编写了一个自定义类,用于启用双缓冲选项以及启用/禁用每个滚动条的可能性。

   Public Class PanelDoubleBuffer
    Inherits Panel

    'MAIN LAYOUT design scheme
    Public Property ShowVerticalScrolBar As Boolean = False
    Public Property ShowHorizontalScrolBar As Boolean = False

    Public Sub New()
        SuspendLayout()

        SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        SetStyle(ControlStyles.UserPaint, True)

        SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
        SetStyle(ControlStyles.SupportsTransparentBackColor, True)
        SetStyle(ControlStyles.ResizeRedraw, True)
        Me.UpdateStyles()

        ResumeLayout()
    End Sub

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

    Public Property SB_HORZ As Integer = ShowHorizontalScrolBar
    Public Property SB_VERT As Integer = ShowVerticalScrolBar
    Public Property SB_CTL As Integer = 2
    Public Property SB_BOTH As Integer = 3

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = &H85 Then
            ShowScrollBar(Me.Handle, CInt(SB_BOTH), False)
        End If

        MyBase.WndProc(m)
    End Sub
End Class