如何调整我构建的自定义控件的大小

时间:2011-01-31 09:57:21

标签: c# winforms resize custom-controls

我正在使用以下代码调整自定义控件的大小:

private void Form1_Resize_1(object sender, EventArgs e)
{

    textBox1.Text = this.Width.ToString();
    textBox2.Text = (this.Height - 200).ToString();

   canvas21.Size = new System.Drawing.Size(this.ClientSize.Width,  this.ClientSize.Height - this.Top - 15);

    canvas21.Invalidate();

}

我只想让自定义控件(0,105)的左上角保持原位,并且控件要随表单一起调整大小,但由于某种原因,这不起作用。当我调整控件的大小时,会自动调整大小以填写表单的其余部分。

Overview of form layout

有没有办法获取影响usercontrol大小的所有内容的列表。为了搜索我设定的其他地方,我可能会忽略它?

6 个答案:

答案 0 :(得分:6)

如果您希望控件始终使用表单调整大小,可以使用Anchor属性将其设置为锚定到表单的一侧或多侧,这样您就不必拥有自己的控件调整代码大小(假设您使用此标准调整大小功能符合您的需求)。

您必须确保未设置Dock属性,否则它可能会填满整个表单(或表单的一侧,具体取决于设置)。

答案 1 :(得分:4)

真的没有理由为什么设置高度然后锚定到每一侧(对接设置为无)都不起作用。

但是,我确实注意到您提供的代码的逻辑错误。你有:

canvas21.Size = new System.Drawing.Size(this.ClientSize.Width,  this.ClientSize.Height - this.Top - 15);

实际应该是:

canvas21.Size = new System.Drawing.Size(this.ClientSize.Width,  this.ClientSize.Height - this.canvas21.Top - 15);

你只是占据了表单的顶部,而不是canvas21的顶部,这就是你需要的。

这似乎完全符合您的要求,至少从我的角度来看。如果它不能正常工作,是不是根本没有为你调整大小,还是调整到错误的大小?

答案 2 :(得分:2)

如果可以设置,使用Anchor属性是更好的方法。要锁定的是

left, top, right, bottom (all!)

Anchor让你可以控制x个单位形成你已经锁定的一侧,这样它与两侧的距离总是相同的。

如果这不是一个选项,或者只是为了让你的代码继续下去,试试这个

private void Form1_Resize_1(object sender, EventArgs e)
{
    textBox1.Text = this.Width.ToString();
    textBox2.Text = (this.Height - 200).ToString();

    int iTop = canvas21.Top;
    int iLeft = canvas21.Left;
    // - 200 - iTop keeps it 200 from the bottom, -iLeft keeps i stuck to right
    canvas21.Size = new System.Drawing.Size(this.Width -iLeft, this.Height-200 -iTop);
    canvas21.Left = iLeft;   // move back
    canvas21.Top = iTop;   // move back
    canvas21.Invalidate();
}

要保持15 pixels in the bottom,请将200上方更改为15。或者,在设计时或通过代码将其设置为15,激活bottom锚点。

答案 3 :(得分:0)

对于自定义控件以外的控件,您可以正确调整大小吗?例如,如果您放入一个richtextbox并相应地设置Anchor(全部),它会为您正确调整大小吗?如果确实如此,那么控制器的尺寸肯定会有些腥味,但是你可以通过这样做来欺骗它......

  1. 创建一个确切大小的面板,并从您的控件中锚定您想要的内容。
  2. 将控件添加到Panel并将Dock设置为“Fill”。实际上,您将使用控件填充面板,并使用面板控制表单上的调整大小。
  3. 如果您的面板当然没有正确调整大小,那么这对您不起作用。当然,这可能是一个基础代码问题的解决方法,在一个完美的世界中,它将在控件本身上被重新编写。

答案 4 :(得分:0)

我正在调整用户控件的大小,我正在使用许多不同的事件来处理这个问题(例如,OnSizeChanged,OnFontChanged,OnTextChanged)

根据您的控件中文本框的适用方式会有所不同,但如果您的主容器具有属性AutoScaleMode或AutoSize,那么您可能会发现您没有捕获所有相关事件。

如果我因为我不熟悉这种事情,我会提前通知。

PS。我最初没有找到你的帖子,因为我一直在寻找标签Windows-forms-designer和custom-control。我真的不知道我应该使用哪些标签,并且不能使用所有可能性,因为5的限制接管了!

答案 5 :(得分:0)

老兄,你会踢自己。你不想要ClientSize.Height - Top - 15,你想要ClientSize.Height - canvas21.Top - 15.就是这样!

private void Form1_Resize_1(object sender, EventArgs e)
{
    textBox1.Text = this.Width.ToString();
    textBox2.Text = (this.Height - 200).ToString();

    canvas21.Size = new System.Drawing.Size(this.ClientSize.Width,  
        this.ClientSize.Height - canvas21.Top - 15);

    canvas21.Invalidate();
}