如何确保滚动条不与内容重叠?
时间:2020-03-05 18:42:58 来源:igfitidea点击:
当使用.NET和WinForms创建可滚动的用户控件时,我反复遇到过这样的情况,例如,弹出一个垂直滚动条,与控件的内容重叠,从而导致也需要一个水平滚动条。理想情况下,内容将稍微收缩以为垂直滚动条腾出空间。
我当前的解决方案是将控件保持在最右边40像素左右,以使垂直滚动条占据空间。由于这仍然是控件的有效客户空间,因此即使没有任何控件被隐藏,水平滚动条在被垂直滚动条覆盖时仍会出现。但是,至少用户实际上并不需要使用出现的水平滚动条。
有没有更好的方法可以使这一切正常?有什么方法可以防止不必要和不需要的滚动条完全显示?
解决方案
回答
如果控件在面板内,请尝试将面板的AutoScroll属性设置为False。这将隐藏滚动条。我希望这可以为我们指明正确的方向。
myPanel.AutoScroll = False
回答
我们将需要稍微调整控件的大小以适应垂直滚动条的宽度。一种通过对接实现此目的的方法。我们不仅需要在窗体上放置控件,还需要在面板,填充,最小/最大大小调整和停靠上进行一些操作。
这是示例代码,我们可以将其放置在空白的新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;