【问题标题】:Force FlowLayoutPanel to re-layout all controls after they have been added and layed out prior强制 FlowLayoutPanel 在添加和布局之前重新布局所有控件
【发布时间】:2014-06-29 18:22:01
【问题描述】:

我有一个FlowLayoutPanel,当我的表单第一次实例化时,我会在其中添加控件。在此之后,我将表单展示给用户。我想允许用户选中一个复选框,该复选框将更改 FlowLayoutPanelWrapContents 属性并让它重新布局我最初添加到它的所有控件。

我在SuspendLayoutResumeLayoutPerformLayout 上阅读了很多帖子,但它们似乎都只与您最初添加控件时有关,而不是在添加控件之后。

所以我认为解决方案是从面板中删除所有控件,更改WrapContents 属性,然后在用户选中复选框时重新添加所有控件?这似乎工作太多了,有没有更简单的方法来做到这一点?

【问题讨论】:

    标签: c# forms user-interface controls


    【解决方案1】:

    flowLayoutPanel.FlowDirection = flowLayoutPanel.FlowDirection; 将强制重新渲染。

    至于它的优雅……让没砍过的人先扔石头。

    【讨论】:

      【解决方案2】:

      SuspendLayout/ResumeLayout 通常在您向FlowLayoutPanel 添加控件并且不希望在每个添加之后发生布局时使用。在您说 resume 之前,它会暂停(甚至可能是强制的)。

      在您的情况下,您已经准备好控件集合。更改 WrapContents 将导致布局(显然),但只有一次。使用SuspendLayout/ResumeLayout不会有任何好处。

      如果您在更改WrapContents 后没有立即更新布局,那么您忘记在某个地方调用ResumeLayout,它应该被调用的次数与挂起的次数相同。

      【讨论】:

      • 在更改WrapContents 属性或在我的代码中的任何其他时间,我从未调用过Suspend/Resume。我只是使用aControl.WrapContents = !aControl.WrapContents 将其从一个更改为另一个。当调用该行时,面板中的控件不会重新布局。实际上什么也没发生。
      • 也许我的假设是错误的,来自msdn随后调整面板大小会将布局重新应用到包含的控件。尝试引起调整大小事件。不知道how
      • 我继承了FlowLayoutPanel 并添加了覆盖函数public void OnResize() {this.OnResize(EventArgs.Empty);} .. 有点工作。但它的行为非常不稳定。 // 所以真的没有一种方法可以“重新布局”整个面板吗?我认为这将是一个非常有用的方法...
      • 其实ResumeLayout(bool performLayout)重载可以强制,但只能是挂起的布局请求。您可以尝试添加 fake 布局请求(通过向Controls 添加一些内容,然后将其删除,并被挂起/恢复包围)。 nothing 之后没有必要直接强制布局(对我来说,改变WrapContents 并没有这样做是一个很大的惊喜,也许实现它有一些困难)。 行为非常不规律是什么样的?
      • 行为不稳定 = 我的代码不能很好地与面板配合使用,我是表单和控件的新手 // 我想我将尝试不同类型的布局面板。我认为有一些东西可以在我的情况下做得更好。如果您仍然想帮助stackoverflow.com/questions/23610824/…,请查看此帖子
      猜你喜欢
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      相关资源
      最近更新 更多