Сведения о вопросе

DED

20:39, 7th August, 2020

Теги

.net   winforms    

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

Просмотров: 437   Ответов: 2

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

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

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



  Сведения об ответе

PHPH

22:16, 14th August, 2020

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

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

#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;


  Сведения об ответе

ЯЯ__4

16:30, 28th August, 2020

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

myPanel.AutoScroll = False


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться