Как изменить размер пользовательского элемента управления, который я создал - PullRequest
6 голосов
/ 31 января 2011

Я изменяю размеры своего пользовательского элемента управления, используя следующий код:

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

Есть ли способ получить список всего, что влияет на размерпользовательского контроля.Чтобы найти другие места, размер которых я установил, которые я мог упустить из виду?

Ответы [ 6 ]

6 голосов
/ 31 января 2011

Если вы хотите, чтобы размер элемента управления всегда изменялся с формой, вы можете использовать свойство Anchor , чтобы привязать его к одной или нескольким сторонам формы, чтобы вам не приходилосьВаш собственный код изменения размера (при условии, что стандартная функциональность изменения размера, которую вы получаете с этим, соответствует вашим потребностям).

Необходимо убедиться, что свойство Dock не установлено, в противном случае оно может заполнить всю форму (или одну сторону формы в зависимости от настройки).

4 голосов
/ 09 февраля 2011

Нет никаких причин, по которым установка высоты, а затем привязка к каждой стороне (с установкой стыковки в ноль) не должны работать.

Однако я заметил ошибку в логике предоставленного вами кода. У вас есть:

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 голосов
/ 31 января 2011

Использование свойства Anchor - лучший способ, если вы можете установить его. Те, которые нужно заблокировать:

left, top, right, bottom (all!)

Якорь позволяет вам контролировать х единиц с заблокированной вами стороны, так что она всегда находится на одинаковом расстоянии от сторон.

Если это не вариант или просто заставить ваш код работать, попробуйте это

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.

0 голосов
/ 12 февраля 2011

Чувак, ты собираешься пнуть себя.Вы не хотите 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();
}
0 голосов
/ 09 февраля 2011

Я смотрю на изменение размера пользовательского элемента управления и использую множество различных событий для обработки этого (например, OnSizeChanged, OnFontChanged, OnTextChanged)

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

Я заранее прошу прощения, если я вне поля зрения, поскольку я новичок в такого рода вещах.

пс. Изначально я не нашел ваш пост, так как просматривал теги Windows-form-designer и custom-control. Я действительно не знаю, какие теги мне следует использовать, и не могу использовать все возможности, так как ограничение в 5 вступает в силу!

0 голосов
/ 08 февраля 2011

Для элементов управления, отличных от вашего пользовательского элемента управления, вы можете настроить его для правильного изменения размера?Например, если вы поместите в richtextbox и установите Anchor соответственно (все), будет ли он правильно изменять размер для вас?Если это произойдет, тогда должно быть что-то подозрительное с размерами вашего элемента управления, НО вы можете обмануть это, выполнив это ...

  1. Создайте панель того размера и привязки, которые вам нужныот вашего контроля.
  2. Добавьте свой элемент управления на панель и установите Dock на «Fill».По сути, вы заполняете панель своим элементом управления и используете панель для управления изменением размеров в форме.

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

...