滚动条处理winforms中的滚动事件

时间:2017-04-21 15:35:15

标签: c# winforms

我正在创建一个看起来像这样的表单。

Form1有两个面板:

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

enter image description here

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

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

b)如果我在顶部面板上放置了一个按钮,其位置超过了form1的高度,那么它会滚动,但如果我把它放在任何子面板(红色或绿色)中则不是

c)不是在顶部面板中将自动滚动设置为true,我可以创建自己的滚动条,但我找不到一个简单的示例来处理移动面板的滚动事件,以便视图端口更改为期望的。

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

1 个答案:

答案 0 :(得分:1)

正如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);
    }
  }
}