C#:锚定面板不会正确调整大小

Posted

技术标签:

【中文标题】C#:锚定面板不会正确调整大小【英文标题】:C#: Anchored Panel won't resize properly 【发布时间】:2011-01-11 16:43:00 【问题描述】:

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

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

我看不出通过拆分器和通过表单调整大小之间的区别。

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

编辑:为了更清楚:将用户控件添加到 TabPage 并设置为 Dock=DockType.Fill。

Edit2:为了让它更复杂:这是控件使用的层次结构: 表单包含一个带有 2 个控件(A 和 B)的拆分器。 (B) 包含一个带有 splitContainer 的用户控件 (C)。 (C) 中的拆分容器->panel1 包含一个选项卡控件 (D)。此选项卡控件 (D) 包含一个用户控件 (E)(在选项卡页中)。此用户控件 (E) 有一个拆分容器 (F),其中放置了另一个带有 tabControl (G) 的用户控件。此选项卡控件 (G) 具有选项卡页,并且在此页面中放置了所描述的用户控件 (H)。

如果我将控件 (H) 直接放在拆分容器 (C) 中的面板上,一切正常。由于添加到 splitcontainer 或 tabpage 的所有控件都设置为 docktype=fill,我不明白为什么最后一个控件有这个问题。

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

编辑:我上传了一个 TestApplication,您可以使用它来重现此问题。 http://rapidshare.de/files/49092516/TestApplication.zip.html 它只发生在 Vista 下。 Win XP 和 7 正常工作... 如果您调整表单大小,带有“...”按钮的文本框不会调整大小,但如果您通过垂直 splitContainer 调整大小,它会起作用。

【问题讨论】:

你能粘贴设计器生成的代码吗(它将所有控件链接在一起)?我的第一个猜测是,您的面板被锚定到与您想象的不同的控件(例如拆分的面板之一) 粘贴的代码太多了,但我不止一次检查了锚点并且设置正确(使用拆分器时调整大小可以证明这一点) 【参考方案1】:

存在一个深度嵌套错误,其中内核耗尽堆栈空间,导致调整大小、停靠和锚定失败。

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

【讨论】:

这就是解决方案。非常感谢! 太棒了。我自己也有这个确切的问题。谢谢。 老实说,我并没有真正希望找到解决这个问题的方法。谢谢。 这只是找到support.microsoft.com/kb/953934 的唯一方法。花了几个小时的忍者级谷歌搜索才能找到这个。非常感谢!!!根据我现在的经验,应用程序在通过 Citrix 运行时似乎更容易出现此问题,尤其是在 64 位 Windows 上运行的 Citrix。 8年后这个bug还存在吗?【参考方案2】:

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

【讨论】:

我尝试了几种锚定和对接的可能性,但不幸的是这没有帮助。看来这一定是框架的一个bug……【参考方案3】:

您已经谈到了“锚”和“码头”,它们的用途相似,但作用不同。你的问题可能是你试图同时做这两个,这会干扰你想要的行为。如果没有,也许尝试从一个切换到另一个。

听起来您已经仔细检查了控件的类别,但您是否通过以下方式检查过它:查看->其他 Windows->文档大纲(我最近才发现的一个非常方便的工具)?

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

祝你好运。

【讨论】:

感谢文档大纲窗口的提示,非常方便。但是由于这个问题不仅出现在应用程序中,而且出现在简单的测试应用程序中,我无法弄清楚为什么它应该是混合锚定和对接的问题。但我会检查一下。关于 UI:在测试应用程序中看起来很奇怪,但在实际应用程序中存在动态部分,并且某些项目可能被隐藏。我们的客户非常方便地批准它;)

以上是关于C#:锚定面板不会正确调整大小的主要内容,如果未能解决你的问题,请参考以下文章

如何正确调整从 C# 中的库生成的条形码大小

如何在 Windows 窗体中调整列表控件的添加/删除大小以提供类似锚定的行为

从底部调整大小时防止Windows窗体元素离开视图?

SwiftUI:滚动视图中的顶部锚定可调整大小视图

Extjs:面板内的工具栏未在浏览器调整大小时调整大小

WinForm开发中实现控件随窗体大小的改变而自动适应其改变