【问题标题】:Expand and collapse winform展开和折叠 winform
【发布时间】:2014-07-14 16:48:30
【问题描述】:

我想要做的是展开和折叠我的 winform 中间。我知道这里有类似的问题,但没有一个真正能满足我的需要。我已经阅读了有关使用 FlowLayoutPanel 的信息,但我无法让它工作。

我想要实现的一个例子是:

我有我的 winform(示例)

当我单击button1 时,它应该隐藏中间的文本框并缩小表单以隐藏空间,反之亦然,当我单击button2 时。无论哪种方式,button3 都应保留在文本框显示或未显示的位置下方。

到目前为止,我的尝试要么只是隐藏文本框而不对表单做任何事情,要么缩小了很多。我目前一直在将AutoSize 设置为true 并将AutoSizeMode 设置为GrowAndShrink

我见过可以执行此操作或类似操作的控件,但它们有箭头或小按钮来展开表单,我只需要按钮即可。

有没有简单的方法可以做到这一点?

任何帮助表示赞赏。

更新

我尝试将高度设置为 0 并按照建议隐藏文本框,但它只是折叠表单的右侧而不是中间。

【问题讨论】:

  • 将height属性设为0并隐藏?使用您知道的高度从放置第三个按钮的位置的 y 坐标中减去,并从表单 y 大小中删除文本框的高度,以相应地缩小。只需在您想显示时重新添加它们
  • 我最近写了一些类似的东西,已经在网上找到了几个例子。例如,查看codeproject.com/Articles/53318/…collapsiblepanel.codeplex.com/releases/view/25409。还有很多第三方控件可以做到这一点; DevExpress 有一个可折叠的面板控件。您可以从按钮模拟面板标题的单击事件(而不显示面板标题!)

标签: c# winforms


【解决方案1】:

您需要将表单的原始高度存储在一个变量中,以便以后再次展开时可以恢复它。此外,如果将 Button3 锚定到底部,则无需在调整大小期间处理它:

public partial class Form1 : Form {
  private int originalHeight;

  public Form1() {
    InitializeComponent();
    button3.Anchor = AnchorStyles.Left | AnchorStyles.Bottom;
  }

  protected override void OnLoad(EventArgs e) {
    originalHeight = this.Height;
    base.OnLoad(e);
  }

  private void button1_Click(object sender, EventArgs e) {
    textBox1.Visible = false;
    this.Height = originalHeight - textBox1.Height;
  }

  private void button2_Click(object sender, EventArgs e) {
    this.Height = originalHeight;
    textBox1.Visible = true;
  }
}

在表单上留下AutoSize=false;,因为您要自己处理调整大小。

我会考虑使用一个按钮来处理表单的切换,因为当表单展开时 Button2 相当无用,反之亦然,如果表单折叠则 Button1 相当无用。

【讨论】:

  • 太棒了! :) 正是我想要的。我会按照您的建议切换 1 个按钮,这要好得多,非常感谢!
  • 虽然这种方法有效,但我相信这是实现你想要的一种糟糕的方法。布局上的任何更改都需要大量代码更改,并引入其他无用的变量。 (并不是说这不是您问题的答案:它是......这只是一种非常糟糕的做法)
【解决方案2】:

这必须使用面板和停靠来完成。使用AutoSize 是错误的方式。

【讨论】:

    【解决方案3】:

    我知道,我迟到了,但由于我刚刚解决了同样的问题,所以我想为您提供我的解决方案:

    正如您已经提到的,您可以使用FlowLayoutPanel 来完成这项工作。只需将其放入您的表格中即可。将 FlowDirection 设置为 TopDown 并以正确的顺序添加按钮和文本框。 完成后,将表单的AutoSize 和FlowLayoutPanel 设置为true,并将AutoSizeMode 设置为GrowAndShrink

    自动调整大小时防止宽度折叠

    您的问题是,如果您将 AutoSize 设置为 true 并禁用/隐藏您的文本框,宽度将会减小。发生这种情况是因为您的文本框是窗体上最宽的控件,如果它被隐藏,则宽度会减小到其余控件所需的宽度。为防止这种情况发生,只需将按钮放入与文本框宽度相同的面板控件中。 现在,如果您的文本框被隐藏,宽度将保持为所需的宽度。

    使用复选框展开/折叠

    我喜欢使用复选框来展开/折叠,而不是使用两个按钮。调整大小的整个编码将简化为将checkbox1.Checked 属性的绑定行添加到文本框的Visibility 属性:

    textbox1.DataBindings.Add("Visible", checkbox1, "Checked")

    【讨论】:

      【解决方案4】:

      隐藏控件并相应地设置 Height 属性。

      【讨论】:

        猜你喜欢
        • 2018-12-13
        • 2013-06-06
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 2014-02-26
        • 2016-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多