2008-08-25 4 views
2

Beim Erstellen scrollbarer Benutzersteuerelemente mit .NET und WinForms bin ich wiederholt auf Situationen gestoßen, in denen zum Beispiel eine vertikale Bildlaufleiste erscheint, die den Inhalt des Steuerelements überlappt und eine horizontale Bildlaufleiste erforderlich macht. Im Idealfall würde der Inhalt ein wenig schrumpfen, um Platz für die vertikale Bildlaufleiste zu schaffen.Wie kann ich sicherstellen, dass Bildlaufleisten Inhalte nicht überlappen?

Meine aktuelle Lösung bestand darin, meine Kontrollen nur aus dem rechten 40 Pixel oder so zu halten, dass die vertikale Scroll-Leiste aufnehmen wird. Da dies immer noch der Client-Speicherplatz für das Steuerelement ist, wird die horizontale Bildlaufleiste immer noch angezeigt, wenn sie von der vertikalen Bildlaufleiste verdeckt wird, obwohl keine Steuerelemente ausgeblendet sind. Aber dann muss der Benutzer zumindest nicht verwenden die horizontale Bildlaufleiste, die aufkommt.

Gibt es einen besseren Weg, dies alles zu funktionieren? Eine Möglichkeit, die unnötigen und unerwünschten Scrollbalken überhaupt nicht erscheinen zu lassen?

Antwort

1

Sie müssen die Größe Ihrer Steuerelemente leicht anpassen, um die Breite der vertikalen Bildlaufleiste anzupassen. Ein Weg, dies zu erreichen, ist das Andocken. Anstatt nur die Steuerelemente auf dem Formular zu löschen, müssen Sie ein wenig mit Panels, Padding, Min/Max-Größenanpassung und Andocken spielen.

Hier ist Beispielcode, den Sie hinter einem leeren neuen Form1 platzieren können. Ändern Sie die Größe des Formulars im Designer oder in der Laufzeitumgebung und Sie werden feststellen, dass die horizontale Bildlaufleiste nicht angezeigt wird und die Felder nicht überlappen. Ich habe auch die Felder eine maximale Breite für ein gutes Maß gegeben:

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

Wenn sich Ihre Steuerelemente in einem Bereich befinden, versuchen Sie, die AutoScroll-Eigenschaft des Bereichs auf False zu setzen. Dadurch werden die Bildlaufleisten ausgeblendet. Ich hoffe, das weist Sie in die richtige Richtung.