Как я могу убедиться, что полосы прокрутки не перекрывают содержимое?

При создании прокручиваемых пользовательских элементов управления с помощью .NET и WinForms я неоднократно сталкивался с ситуациями, когда, например, всплывала вертикальная полоса прокрутки, перекрывая содержимое элемента управления, в результате чего также требовалась горизонтальная полоса прокрутки. В идеале содержимое должно немного сжиматься, чтобы освободить место для вертикальной полосы прокрутки.

Мое текущее решение заключалось в том, чтобы просто держать элементы управления вне крайних правых 40 пикселей или около того, чтобы вертикальная полоса прокрутки занимала место. Поскольку это все еще фактически клиентское пространство для элемента управления, горизонтальная полоса прокрутки все еще появляется, когда она закрывается вертикальной полосой прокрутки, даже если никакие элементы управления не скрываются вообще. Но тогда, по крайней мере, пользователю фактически не нужно использовать появляющуюся горизонтальную полосу прокрутки.

Есть ли лучший способ заставить все это работать? Каким образом уберечь ненужные и нежелательные полосы прокрутки от отображения?


person Chris Ammerman    schedule 25.08.2008    source источник


Ответы (2)


Вам нужно будет немного изменить размер элементов управления, чтобы соответствовать ширине вертикальной полосы прокрутки. Один из способов добиться этого - стыковка. Вместо того, чтобы просто отбрасывать элементы управления в форме, вам придется немного поиграть с панелями, отступами, минимальным / максимальным размером и стыковкой.

Вот пример кода, который вы можете разместить за новой пустой формой Form1. Измените размер формы в дизайнере или во время выполнения, и вы увидите, что горизонтальная полоса прокрутки не отображается и поля не перекрываются. Я также дал полям максимальную ширину для удобства:

#region Windows Form Designer generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent() {
        this.textBox1 = new System.Windows.Forms.TextBox();
        this.label1 = new System.Windows.Forms.Label();
        this.panel1 = new System.Windows.Forms.Panel();
        this.panel2 = new System.Windows.Forms.Panel();
        this.textBox2 = new System.Windows.Forms.TextBox();
        this.label2 = new System.Windows.Forms.Label();
        this.panel1.SuspendLayout();
        this.panel2.SuspendLayout();
        this.SuspendLayout();
        // 
        // textBox1
        // 
        this.textBox1.Dock = System.Windows.Forms.DockStyle.Top;
        this.textBox1.Location = new System.Drawing.Point(32, 0);
        this.textBox1.MaximumSize = new System.Drawing.Size(250, 0);
        this.textBox1.Name = "textBox1";
        this.textBox1.Size = new System.Drawing.Size(250, 20);
        this.textBox1.TabIndex = 0;
        // 
        // label1
        // 
        this.label1.AutoSize = true;
        this.label1.Dock = System.Windows.Forms.DockStyle.Left;
        this.label1.Location = new System.Drawing.Point(0, 0);
        this.label1.Name = "label1";
        this.label1.Padding = new System.Windows.Forms.Padding(0, 3, 0, 0);
        this.label1.Size = new System.Drawing.Size(32, 16);
        this.label1.TabIndex = 0;
        this.label1.Text = "Field:";
        // 
        // panel1
        // 
        this.panel1.Controls.Add(this.textBox1);
        this.panel1.Controls.Add(this.label1);
        this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
        this.panel1.Location = new System.Drawing.Point(0, 0);
        this.panel1.Name = "panel1";
        this.panel1.Size = new System.Drawing.Size(392, 37);
        this.panel1.TabIndex = 2;
        // 
        // panel2
        // 
        this.panel2.Controls.Add(this.textBox2);
        this.panel2.Controls.Add(this.label2);
        this.panel2.Dock = System.Windows.Forms.DockStyle.Top;
        this.panel2.Location = new System.Drawing.Point(0, 37);
        this.panel2.Name = "panel2";
        this.panel2.Size = new System.Drawing.Size(392, 37);
        this.panel2.TabIndex = 3;
        // 
        // textBox2
        // 
        this.textBox2.Dock = System.Windows.Forms.DockStyle.Top;
        this.textBox2.Location = new System.Drawing.Point(32, 0);
        this.textBox2.MaximumSize = new System.Drawing.Size(250, 0);
        this.textBox2.Name = "textBox2";
        this.textBox2.Size = new System.Drawing.Size(250, 20);
        this.textBox2.TabIndex = 0;
        // 
        // label2
        // 
        this.label2.AutoSize = true;
        this.label2.Dock = System.Windows.Forms.DockStyle.Left;
        this.label2.Location = new System.Drawing.Point(0, 0);
        this.label2.Name = "label2";
        this.label2.Padding = new System.Windows.Forms.Padding(0, 3, 0, 0);
        this.label2.Size = new System.Drawing.Size(32, 16);
        this.label2.TabIndex = 0;
        this.label2.Text = "Field:";
        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.AutoScroll = true;
        this.ClientSize = new System.Drawing.Size(392, 116);
        this.Controls.Add(this.panel2);
        this.Controls.Add(this.panel1);
        this.Name = "Form1";
        this.Text = "Form1";
        this.panel1.ResumeLayout(false);
        this.panel1.PerformLayout();
        this.panel2.ResumeLayout(false);
        this.panel2.PerformLayout();
        this.ResumeLayout(false);

    }

    #endregion

    private System.Windows.Forms.TextBox textBox1;
    private System.Windows.Forms.Label label1;
    private System.Windows.Forms.Panel panel1;
    private System.Windows.Forms.Panel panel2;
    private System.Windows.Forms.TextBox textBox2;
    private System.Windows.Forms.Label label2;
person Community    schedule 25.08.2008

Если ваши элементы управления находятся внутри панели, попробуйте установить для свойства AutoScroll Panel значение False. Это скроет полосы прокрутки. Надеюсь, это укажет вам правильное направление.

myPanel.AutoScroll = False
person Bryan Roth    schedule 25.08.2008