2017-04-21 179 views
1

我正在创建一个看起来像这样的表单。Winforms中的滚动条处理滚动事件

Form1中有两个面板:

  • 底部面板(黄色)
  • 顶部面板,这是他自己由两个面板组成:
    • 左侧面板(红色)
    • 右侧面板(绿色)

enter image description here

如图所示,顶部面板超过了form1的高度,所以我想使用滚动条。我有几个问题:

a)在顶部面板中将自动滚动设置为true不起作用。

B)如果我把顶部面板,其位置上的按钮超过Form1的高度,那么它滚动,但如果我把它放在任何其子面板(红色或绿色)

C),而不是设置在顶部面板自动滚动到true,我可以创建自己的滚动条,但我找不到一个处理滚动事件的简单示例,该滚动事件移动面板,以便视图端口根据需要进行更改。

我该如何正确添加一个具有所需行为的滚动条?

+0

你想在哪里滚动条,在窗体上还是在黄色面板上? – vendettamit

+0

@vendettamit我想在由“红色”和“绿色”面板组成的“顶部”面板中有一个垂直滚动条 – de3

+1

这三个面板看起来应该都是停靠的 - 底部,左侧和填充。为希望滚动条显示的面板设置AutoScrollMinSize。 – LarsTech

回答

0

正如LarsTech和Hans Passant所建议的,AutoScrollMinSize工作,所以a和b问题得到了解决。

关于问题C,我认为有一种方法可以创建一个滚动条,这样它的行为就像我猜99%的滚动条应该表现出来(只是移动所需的面板)。最后,我自己编写了这个逻辑。

我添加了一个Scrollbar1作为基本窗体的控件。 initialPanelY捕获在构造函数上。

这是响应滚动事件的代码。我只是移动面板panelRest2的Y位置取决于滚动条的值

using System; 
. 
. 
using System.Windows.Forms; 

namespace WindowsFormMyTests 
{ 
    public partial class Form1 : Form 
    { 
    int initialPanelY; 
    public Form1() 
    { 
     InitializeComponent(); 
     initialPanelY = this.panelRest2.Location.Y; 
    } 

    private void vScrollBar1_Scroll(object sender, ScrollEventArgs e) 
    { 
     int v = (sender as VScrollBar).Value; //between 1 and 100 
     int hiddenPanelHeight = this.panelRest2.Size.Height - this.Size.Height; 
     float moveY = (float)hiddenPanelHeight * ((float)v/100); 
     int newY = initialPanelY - (int)moveY; 
     this.panelRest2.Location = new Point(this.panelRest2.Location.X, newY); 
    } 
    } 
}