Удалить контроль из формы: пространство все еще занято - PullRequest
0 голосов
/ 02 мая 2018

У меня есть форма, и я хочу переключить показ и скрыть RichTextBox. Если я скрываю элемент управления, он должен отказаться от резервирования пространства, но на самом деле это не так.

Удалено, но исходное пространство, зарезервированное rtbcontrol, все еще отображается как пустое серое пространство. Кажется, это влияет только на элементы управления, которые привязаны ко дну.

Я сделал небольшой пример для демонстрации своей проблемы: Desinger:

namespace HideShowTest
{
    partial class Form1
    {
        /// <summary>
        /// Erforderliche Designervariable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Verwendete Ressourcen bereinigen.
        /// </summary>
        /// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Vom Windows Form-Designer generierter Code

        /// <summary>
        /// Erforderliche Methode für die Designerunterstützung.
        /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
        /// </summary>
        private void InitializeComponent()
        {
            this.richTextBox1 = new System.Windows.Forms.RichTextBox();
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new System.Windows.Forms.Button();
            this.button3 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // richTextBox1
            // 
            this.richTextBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.richTextBox1.Location = new System.Drawing.Point(13, 126);
            this.richTextBox1.Name = "richTextBox1";
            this.richTextBox1.Size = new System.Drawing.Size(289, 80);
            this.richTextBox1.TabIndex = 0;
            this.richTextBox1.Text = "";
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(13, 13);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(92, 23);
            this.button1.TabIndex = 3;
            this.button1.Text = "top anchor";
            this.button1.UseVisualStyleBackColor = true;
            // 
            // button2
            // 
            this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
            this.button2.Location = new System.Drawing.Point(13, 75);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(92, 23);
            this.button2.TabIndex = 2;
            this.button2.Text = "bottom anchor";
            this.button2.UseVisualStyleBackColor = true;
            // 
            // button3
            // 
            this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
            this.button3.Location = new System.Drawing.Point(227, 75);
            this.button3.Name = "button3";
            this.button3.Size = new System.Drawing.Size(75, 23);
            this.button3.TabIndex = 1;
            this.button3.Text = "Hide Rtb";
            this.button3.UseVisualStyleBackColor = true;
            this.button3.Click += new System.EventHandler(this.button3_Click);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(314, 226);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.button3);
            this.Controls.Add(this.richTextBox1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.RichTextBox richTextBox1;
        private System.Windows.Forms.Button button3;
        private System.Windows.Forms.Button button2;
        private System.Windows.Forms.Button button1;
    }
}

и код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace HideShowTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (richTextBox1.Visible)
            {
                richTextBox1.Hide();

                this.Height -= richTextBox1.Height;
            }
            else
            {
                richTextBox1.Show();

                this.Height += richTextBox1.Height;
            }
            button3.Text = richTextBox1.Visible ? "Hide Rtb" : "Show Rtb";
        }
    }
}

Если я нажму «Hide Rtb», нижняя кнопка привязки поднимется вверх (она должна остаться на том же месте).

1 Ответ

0 голосов
/ 02 мая 2018

Редактировать : поскольку вы отредактировали вопрос и задали совершенно другую вещь:

У вас есть свойство Anchor button2, установленное влево и Bottom , так что оно будет явно перемещаться при изменении размера формы, чтобы поддерживать одинаковое расстояние между кнопкой и нижней частью форма.

Чтобы избежать этого, вы можете либо установить для свойства Anchor значение Top, либо соответственно изменить расположение кнопки при изменении размера формы. Например:

int t = button2.Top;
ToggleRtbVisibility();
button2.Top = t;

Оригинальный ответ :

1) Если вы хотите переключить «показать и скрыть», скрывайте и отображайте элемент управления, не удаляйте его.

2) Я подозреваю, что вы проверили свойство Size формы вместо свойства ClientSize, но вы изменяете значение ClientSize , Кроме того, не используйте фиксированные числа для изменения размера, вместо этого рассчитайте их.

Попробуйте что-то вроде этого:

private void ToggleRtbVisibility(bool hide)
{
    rtbLog.Visible = !hide;
    int preservedHeight = rtbLog.Height + rtbLog.Margin.Top + rtbLog.Margin.Bottom;
    if (hide)
    {
        this.Height -= preservedHeight;
    }
    else
    {
        this.Height += preservedHeight;
    }
}

И если вы не хотите использовать параметр для явного указания, показывать или скрывать элемент управления, вы можете изменить приведенный выше метод на что-то вроде:

private void ToggleRtbVisibility()
{
    rtbLog.Visible = !rtbLog.Visible;
    int preservedHeight = rtbLog.Height + rtbLog.Margin.Top + rtbLog.Margin.Bottom;
    if (rtbLog.Visible == false)
        this.Height -= preservedHeight;
    else
        this.Height += preservedHeight;
}

Надеюсь, это поможет.

...