【问题标题】:How do you modify a control that has been re-parented to a TabPage?如何修改已重新设置为 TabPage 的控件?
【发布时间】:2010-03-10 18:08:42
【问题描述】:

我有一个用户控件,其中包含一组控件,这些控件可重复用于在 UI 上呈现数据。我尝试实现一个“弹出”选项,该选项将从表单上的另一个容器(例如面板)重新设置控件的父级,创建一个新的选项卡页,然后将控件添加到选项卡页。

不幸的是,当控件被添加到 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!");
        }
    }
}

【问题讨论】:

    标签: c# .net winforms tabcontrol tabpage


    【解决方案1】:

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

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

    无论如何,我希望这能给你一些想法......

    【讨论】:

      【解决方案2】:

      控件首先添加到容器控件中。通过 Reflector 深入容器代码的内部,它正在为我的控件设置最小/最大大小值,该控件正在重新设置父级。我不准确地假设默认的最小/最大设置是设计者的默认设置。不幸的是,容器控件的决定不同。去吧,去吧,反射器!当然,这种行为没有记录在案。

      感谢大家的帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        相关资源
        最近更新 更多