Winforms 用户控件在另一个用户控件中时被剪辑(有时)

Posted

技术标签:

【中文标题】Winforms 用户控件在另一个用户控件中时被剪辑(有时)【英文标题】:Winforms user control getting clipped when in another user control (sometimes) 【发布时间】:2010-09-18 22:54:39 【问题描述】:

这个问题相当简单,但最好用视觉来说明。请注意,所有屏幕截图均来自 Visual Studio 2005 设计图面。当我实际运行应用程序时,我发现没有任何区别。

这是我的用户控件(我们称之为 UC-1):

控件上的按钮设置为锚定到底部 + 右侧。

这是放置在特定父用户控件 (UC-A) 上时的样子:

请忽略颜色等的差异。一些样式是在用户控件的构造函数中完成的。

注意控件的底部被剪掉了。父级上使用的控件的实例设置有“FixedSingle”边框。另请注意,消耗的控件比原始控件高,表明按钮底部锚点设置受到尊重,但基本上超出了应有的位置。

要确认这肯定是父控件上的问题,请注意另一个用户控件 (UC-2) 在放置在同一父控件上时包含数据网格视图:

再次,使用的控件的实例设置有“FixedSingle”边框,这有助于说明剪辑。数据网格正确锚定在右下角。为了加强这个问题的复杂性,下面是第一个用户控件 (UC-1) 放置在不同的父用户控件 (UC-B) 上时:

alt text http://i38.tinypic.com/2rnyjd0.png

这是被表单使用时的第二个“已使用”控件 (UC-2):

注意,这次没有剪辑。

我花了很多时间搜索和尝试解决这个问题。我已经用尽了边距、填充、大小(最小/最大)、位置、锚点等的各种设置。我一生都无法弄清楚为什么这个用户控件会导致子用户控件像这样剪辑.

我注意到的另一件奇怪的事情是,当我在父用户控件设计表面(控件行为异常的地方)上执行 UNDO 时,即使撤消操作与这些控件无关,被剪裁的用户控件实例实际上也会移动位置。例如,如果我使主包含控件更大,然后撤消,几个子用户控件会跳起来。它们似乎在被剪裁时移动。非常可疑。

有人知道发生了什么吗??

【问题讨论】:

您找到解决方案了吗? 没有。这是去年的一个项目中的一个问题,我已经工作了很长时间。由于这是一个设计时问题,所以在我们开始工作后就不再担心了,所以我没有多想。 【参考方案1】:

一个非常有趣的问题!

您的问题父级 (UC-A) 是否会覆盖任何有关大小调整或客户区域的方法?

或者 UC-A 的 Padding 或 Margin 的底部值是否为负值?

在 UC-A 的底部边缘是否有其他东西停靠?也许,有负尺寸的东西?

或者,UC-A 是否设置了其子控件的约束?如果面板的最小高度被强制太大,你会得到这个结果。

希望这有帮助!如果没有,您是否有机会将来源发布到 UC-A?

【讨论】:

【参考方案2】:

我遇到了完全相同的问题,并在寻找可能的解决方案时找到了您的帖子。尽管我很确定这是 winforms 中的一个错误,但我找到了一些解决方法。只需将用户控件中的所有内容放在面板内,将面板停靠到完整位置,然后在面板内进行锚定。这似乎缓解了这个问题,尽管我的按钮确实倾向于以与父控件中的大小略有不同的大小显示。很奇怪。我通过在设计器中使按钮变小来进行补偿,并且由于某种未知原因,它在父控件中扩展了几个像素。希望这会有所帮助。

【讨论】:

【参考方案3】:

假设有问题的父控件不是标准的 .NET 框架类型,而是自定义的,我猜想它在其逻辑中的某处混淆了客户端和屏幕坐标。但这只是猜测。

【讨论】:

以上是关于Winforms 用户控件在另一个用户控件中时被剪辑(有时)的主要内容,如果未能解决你的问题,请参考以下文章

winforms - 表单加载期间带有dockstyle填充的用户控件大小不正确

WPF 引发异常解析 XAML,其中包括 Winforms 用户控件

自定义 Winforms 设计器控件同时缩放和平移控件

将 Winforms 控件置于最前面

将 WPF 控件与 WinForms 一起使用

在默认 AppDomain 中的 Winforms 中托管 WPF 用户控件的弹出窗口中的选项卡导航损坏