2012-02-27 102 views
1

介绍奇怪的自动滚屏的行为

我写了一个简单的用户控制。

该控件包含一个FlowLayoutPanel和一个按钮。

按钮单击事件处理程序如下:

private void uxAdd_Click(object sender, EventArgs e) 
{ 
    count++; 
    Label label = new Label(); 
    label.Text = "Label " + count.ToString(); 
    uxFlowLayout.Controls.Add(label); 
} 

Add按钮添加一个标签到FlowLayoutPanel而且由于FlowLayoutPanel.AutoSize和控制的AutoSize属性等于真实FlowLayoutPanel.FlowDirection等于TopDown控制会身高增加。

我已将我的用户控件放在窗体上,并将窗体的AutoScroll属性设置为true。

而且我写了下面布局事件处理程序:

private void MainForm_Layout(object sender, LayoutEventArgs e) 
{ 
    uxSection.Width = this.ClientSize.Width; 
} 

uxSection是我在介绍部分的开头讲的用户控件)

问题

这是我在做什么:

步骤0。运行该程序。

步骤1。添加几个标签,以便显示垂直滚动条。

步骤2。滚动到表单底部。

步骤3。水平调整窗体大小。

enter image description here

正如你所看到的,调整后的形式,滚动条位置是不是在底部(我希望它是在底部)。

所以问题是,我错过了什么?为什么滚动条重置到顶部?

+2

为什么它看起来像滚动条是在窗体上,而不是在UserControl? FlowLayoutPanel中的按钮也是?标签无法获得焦点,但您的按钮可以,这就是为什么它滚动回到视图。 WinForms试图帮助用户在屏幕上显示活动控件。 – LarsTech 2012-02-28 13:57:23

+0

@LarsTech:现货! – RvdK 2012-02-28 14:11:25

+0

@LarsTech:谢谢你的提示。经过一番谷歌搜索后,我发现了一个解决方法:http://nickstips.wordpress.com/2010/03/03/c-panel-resets-scroll-position-after-focus-is-lost-and-regained/ – 2012-02-29 07:31:46

回答

0

发生这种情况是因为整个控件在调整大小时重新绘制。

您需要将滚动条的位置保存在变量中,以便在发生调整大小事件时可以重置滚动条的位置,或者您想要将滚动条推到底部通过使用列表中的项目数来触发调整大小事件时列出底部元素的位置,然后将滚动条推送到该位置。