Winfrom,Panel自动滚动条的小坑

最近在弄一个聊天界面,见下图,需要实现滚动条功能,滚动条实际上就用panel的autoScroll=True,然后等控件高度超过panel本身高度就会自动出现。

重要的事情说三遍:Panel设置完AutoScroll=True以后,只要控件内部控件高度超过Panel,就可以自动滚动。 

测试代码,这个代码实现点击一下,添加一个按钮到p1。当按钮多了以后,就会自动显示滚动条。

   int count = 0;
        private void btnAdd_Click(object sender, EventArgs e)
        {
            Button btn = new Button();
            btn.Width = 150;
            btn.Height = 70;
            btn.Top = 80 * count;
            btn.Left = 10;
            btn.Text = String.Format("按钮{0:d3}", count);
            p1.Controls.Add(btn);
            count++;
        }

见下图,好像没有啥问题。

如果Panel宽度变了,里面的按钮,宽度也要变。这个也简单,设置一下anchor ,设置左右就行了。见下面代码:

  int count = 0;
        private void btnAdd_Click(object sender, EventArgs e)
        {
            Button btn = new Button();
            btn.Width = 180;
            btn.Height = 70;
            btn.Top = 80 * count;
            btn.Left = 10;
            btn.Anchor = AnchorStyles.Left | AnchorStyles.Right;//设置左右会变化
            btn.Text = String.Format("按钮{0:d3}", count);
            p1.Controls.Add(btn);
            count++;
        }

运行效果,按钮会随着panel大小变化,但是滚动条没有出现。(蓝色垂直条是spliter) 

 经过测试发现,必须给按钮添加到AnchorStyles.Top。才会使滚动条出来。

 经过测试发现,必须给按钮添加到AnchorStyles.Top。才会使滚动条出来。

 经过测试发现,必须给按钮添加到AnchorStyles.Top。才会使滚动条出来。

   int count = 0;
        private void btnAdd_Click(object sender, EventArgs e)
        {
            Button btn = new Button();
            btn.Width = 180;
            btn.Height = 70;
            btn.Top = 80 * count;
            btn.Left = 10;
            //必须加上AnchorStyles.Top
            btn.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;//设置左右会变化
            btn.Text = String.Format("按钮{0:d3}", count);
            p1.Controls.Add(btn);
            count++;
        }

添加完 AnchorStyles.Top,运行测试:成功了 

结论:Panel自动滚动,子控件必须设置 AnchorStyles.Top,不设置不行。