代码之家  ›  专栏  ›  技术社区  ›  Jan-Patrick Ahnen

C:锚定面板无法正确调整大小

  •  20
  • Jan-Patrick Ahnen  · 技术社区  · 16 年前

    关于用户控件中面板的自动调整大小,我有一个奇怪的问题。此面板锚定到用户控件的所有4个侧面。 但是锚定并不总是像它应该的那样工作:

    如果通过调整窗体大小来调整用户控件的大小,则右锚定和底锚定不起作用。但是,如果使用窗体中的拆分器调整控件的大小,它将正常工作。 所有其他受大小调整影响的控件都能正常工作,只是这个面板不能。

    我看不到通过拆分器和通过窗体调整大小的区别。

    仅当通过移动拆分器来调整大小时,才能在用户控件的OnResize中手动设置大小。如果通过调整窗体大小来调整大小,则面板的高度和宽度不会更改为新值。

    编辑:为了更清楚:用户控件被添加到选项卡页并设置为dock=docktype.fill。

    edit2:要使其更复杂:这是使用控件的层次结构: 表单包含一个拆分器,其中包含两个控件(A和B)。(b)包含一个带有SplitContainer的用户控件(c)。拆分容器(C)中的面板1包含TabControl(D)。此TabControl(d)包含一个用户控件(e)(在TabPage中)。此用户控件(e)具有一个SplitContainer(f),其中放置了另一个带有TabControl(g)的用户控件。这个tabcontrol(g)有tabpages,在这个页面中放置了描述的用户控件(h)。

    如果我把控制(H)直接放在SplitContainer(C)中的面板上,一切正常。由于添加到SplitContainer或TabPage的所有控件都设置为DockType=Fill,所以我看不出上一个控件为什么会出现此问题。

    Windows窗体框架中是否有限制子控件数量的限制?

    编辑:我上传了一个测试应用程序,你可以用它复制这个问题。 http://rapidshare.de/files/49092516/TestApplication.zip.html 它只在vista下发生。Win XP和7工作正常… 如果调整窗体的大小,带有“…”按钮的文本框将不会调整大小,但如果通过垂直拆分容器调整大小,它将起作用。

    3 回复  |  直到 8 年前
        1
  •  36
  •   Just-Harry    8 年前

    有一个深度嵌套的bug,内核耗尽堆栈空间,导致调整大小、停靠和锚定静默失败。

    见 https://web.archive.org/web/20140818095718/http://support.microsoft.com/kb/953934

        2
  •  2
  •   Andy Jacobs    16 年前

    你已经讨论过“锚”和“码头”,它们可以起到类似的作用,但作用不同。你的问题可能是你试图两者兼得,这干扰了你想要的行为。如果没有,可以尝试从一个切换到另一个。

    听起来您已经仔细检查了控件的内容,但是否使用了:视图->其他窗口->文档大纲(一个我最近才发现的非常方便的工具)对其进行了检查?

    最后,虽然它不能直接解决您的问题,但听起来您的UI非常复杂,如果您花一些时间考虑是否可以简化UI,您的用户可能会受益。当然,我不知道你的用户或应用程序的目的,你拥有的可能是最好的,但听起来是时候问这个问题了。

    祝你好运。

        3
  •  1
  •   Kevin Kibler    16 年前

    问题不在于嵌套的深度;控件可以任意深度嵌套。锚定和对接通常不能很好地相互配合。我通常喜欢停靠而不是锚定,但是,无论您选择哪种解决方案,您都应该避免混合它们。