如何修改已重新设置为TabPage的控件?

时间:2010-03-10 18:08:43

标签: c# .net winforms tabcontrol tabpage

我有一个用户控件,其中包含一组控件,可以重复用于在UI上显示数据。我尝试实现一个“弹出”选项,它将从窗体上的另一个容器(例如Panel)重新控制控件,创建一个新的选项卡页面,然后将控件添加到选项卡页面。 / p>

不幸的是,当控件添加到TabPage时,其大小似乎被锁定为与最后一个父级一起显示的方式。

我覆盖了ParentChanged事件以检测控件何时实际添加到TabPage。如果我检查大小,尝试将大小设置为TabPage的ClientRectangle,然后重新检查大小 - 它不会更改。设置Dock属性不会改变此行为(尤其是Fill)。

protected override void OnParentChanged(EventArgs e)
{
    if (this.Parent != null)
    {
        Size oldSize = this.Size;

        this.Size = this.Parent.ClientRectangle.Size;

        if (this.Size == oldSize)
        {
            // this is where we end up
            throw new Exception("We didn't change size!");
        }
    }
}

2 个答案:

答案 0 :(得分:0)

我怀疑如果您将控件设置为Dock,那么它可能会忽略尝试更改其大小/位置。就个人而言,我会关闭Dock / Anchor / AutoSize行为,只需手动设置控件的位置和大小。我已经做了很多这类事情并且从来没有遇到过任何问题,所以我怀疑你只是在与一个自动布局选项进行斗争,而且它已经赢了。

如果您希望Dock为您完成工作,您可能需要启动选项卡以重新计算其布局? (有一个Control.LayoutEngine对象可以做到这一点,但我只是在这里假设一个可能的调查途径 - 我自己没有尝试过)

我希望无论如何都可以给你一些想法......

答案 1 :(得分:0)

首先将控件添加到容器控件中。潜入容器代​​码的内容,通过Reflector,它设置我的控件的最小/最大尺寸值正在重新定位。我错误地假设默认的最小/最大设置是设计者的默认设置。不幸的是,容器控制决定不同。去,去,反射器!当然,这种行为没有记录。

谢谢大家的帮助。