我有一个面板(Windows窗体),我想禁用面板水平滚动条。我试过这个:
HorizontalScroll.Enabled = false;
但那不行。
我该怎么做?
答案 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;
HorizontalScroll.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报告的UserControl
是ClientRectangle
的完整矩形,没有任何滚动条。这意味着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