当显示控件时,子控件重新定位在自动滚动窗体上

时间:2012-10-31 14:21:21

标签: .net winforms autoscroll

我有一个AutoScroll设置为true的表单。表单启动时窗体上的某些控件是不可见的,但它们的位置已设置。一旦控件变为可见,则相对于当前AutoScrollPosition计算位置,这是完全不需要的。

知道怎么防止这种情况?

我尝试在首次显示控件时设置位置,如下所示:

 void OnControlVisibleChanged(object sender, EventArgs e)
    {
        Control ctl = (Control)sender;
        if (ctl.Visible)
        {
            ctl.Location = Point.Add(ctl.Location, new Size(this.AutoScrollPosition));
            ctl.VisibleChanged -= OnControlVisibleChanged;
        }
    }

它适用于某些控件,而其他控件则不适用。我不知道为什么 编辑:似乎当控件变为可见时,真正的AutoScrollPosition会更改,但AutoScrollPosition属性不会立即更新。

1 个答案:

答案 0 :(得分:1)

AutoSize = True似乎会干扰您的代码。我不知道这是否是唯一的失败点,但这在我的测试中起作用了:

void OnControlVisibleChanged(object sender, EventArgs e) {
  Control ctl = (Control)sender;
  if (ctl.Visible) {
    bool moveOK = true;
    if (ctl.GetType().GetProperty("AutoSize") != null) {
      if ((bool)ctl.GetType().GetProperty("AutoSize").GetValue(ctl, null)) {
        moveOK = false;
      }
    }
    if (moveOK) {
      ctl.Location = Point.Add(ctl.Location, new Size(this.AutoScrollPosition));
    }
  }
}