2011-01-31 2 views
6

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

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. Чтобы искать другие места размером, который я установил, что я мог упустить?

+1

Вы уже исследовали свойства 'Dock' и' Anchor'? Использование одного или обоих из них * намного проще, чем вручную реализовать логику изменения размера в событии «Resize», как это делалось годами раньше. –

+0

@ Коди - я пробовал оба из них, но я не могу получить результат, который я хочу. См. Мой ответ на ho1. – Bildsoe

+0

Довольно неясно, что задают. Фрагмент кода определенно неверен, он должен использовать ClientSize и вычитать значения свойства Left и Top элемента управления. –

ответ

6

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

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

+0

Я пробовал использовать свойство Anchor, но он по-прежнему заполняет остальную часть формы внизу и вправо. У меня есть tabControl в верхней части, пользовательский элемент управления под ним и метка под настраиваемым элементом управления. Я хочу, чтобы пользовательский элемент управления заполнил форму, за исключением 15 пикселей внизу. – Bildsoe

+0

@bildsoe: Вы уверены, что свойство 'Dock' не установлено? –

+0

@bildsoe: Чтобы уточнить, свойство 'Dock' переопределит свойство' Anchor'. Если это не задано в свойствах, я бы выполнил поиск кода, чтобы убедиться, что он не установлен в другом месте, и я также предлагаю поиск через код для любых случаев, когда вы устанавливаете какие-либо свойства этого элемента управления (в том числе внутри самого элемента управления!), чтобы узнать, можете ли вы установить свойства 'Dock' или' Size' где-то в них, что может быть причиной. –

2

Использование свойства 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

@cyberwiki - Это не сработало. Я ищу места, где я установил размер или Dock, но не могу найти их, так что это не проблема – Bildsoe

0

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

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

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

0

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

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

Прилагаю заранее, если я вне лучи, поскольку я новичок в этом.

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

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, которая является то, что вам нужно.

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

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(); 
} 
+0

Я уже указывал это в своем посте: P – Yetti

+0

Да, я видел это после того, как я вывешенный. Я поддержал ваш ответ. –

Смежные вопросы