Если вы относительно недавно занимаетесь разработкой графических приложений на c#, то вероятно уже сталкивались с проблемой, когда вы изменяете размер формы, при этом все компоненты (контролы) на ней остаются на своих местах, где вы их накидали в дизайнере Visual Studio. Может в определенных ситуациях такое поведение контролов и нужно, но это скорее редкость. Скорее всего вам хочется, чтобы различные кнопочки, текстбоксы, комбобоксы и т.д. изменяли местоположение, растягивались, сжимались в соответствие с формой, на которой располагаются. Чтобы не изобретать велосипед, взглянем какие свойства компонентов предлагаются в Winforms для данной цели.
Свойство Dock
Данное свойство (property) позволяет привязать элемент управления к одной из сторон родительского (parent) контрола, в котором располагается, либо полностью заполнить всё свободное пространство. Даже если просто перевести с английского, то Dock — это пристань, причал, док. Т.е. вы как бы причаливаете своим контроллом к одной из сторон родителя грубо говоря. Свойство Dock может принимать одной из шести значений перечисления DockStyle:
- None (нет привязки, значение по умолчанию)
- Fill (элемент управления заполняет свободное пространство)
- Left (“прижимаемся” к левому краю)
- Right (к правому краю)
- Bottom (к низу)
- Top (к верху)
Бегло рассмотрим каждое значение. None — компонент располагается там, где вы его расположили. При изменении родительского размера контрол сохраняет местоположение и размер.
Left — контрол прижимается к левому краю родителя, при этом занимает всю высоту, она фиксирована, но можно изменить ширину в дизайнере Visual Studio потянув мышью за правый край, либо в коде. Для примера кину на форму кнопочку (Button) и задам DockStyle.Left. Вот что получилось:
Запустив приложение, поизменяйте размеры формы и заметите, что ширина кнопки не меняется, а по высоте она растягивается, сжимается.
Right работает по аналогии с Left. Только контрол в этом случае прижимается к правому краю. Думаю здесь не стоит расписывать подробно…
Top — элемент управления цепляется к верхнему краю, занимает всю доступную ширину родителя, она фиксированная, а вот высоту можно поменять в дизайнере студии, либо в коде.
Опять же запустите приложение и измените размеры формы. Высота кнопки не меняется, по ширине — растягивается, сжимается.
Bottom — прижимает контрол к нижней части родителя. В остальном по данное свойство действует по аналогии с Top. Ничего сложного.
Fill — заполняет свободное пространство parent’а. Абсолютно никакие размеры контрола с таким свойством нельзя изменить в дизайнере студии, только лишь меняя размеры родителя.
Так же стоит сказать, что если вы попытаетесь задать сразу нескольким элементам управления одно и тоже свойство Dock из следующих — Left, Top, Bottom или Right, то данные контролы будут, образно говоря, прилипать друг к другу.
Для закрепления, взляните как можно не написав ни одной строчки кода, позиционировать несколько кнопок (Button) используя лишь свойство Dock:
Вкратце вроде рассмотрели свойство (property) Dock. Как можно заметить, оно не решает всех потребностей программиста, при позиционировании компонентов управления. К примеру, для некоторых контроллов Dock подходит очень редко. Например взять TextBox, задать ему Dock — Bottom, будет смотреться некрасиво мягко сказать. Так вот, если данное свойство не удовлетворяет вашим потребностям, есть еще полезное property под названием Anchor. Рассмотрим его.
Свойство Anchor
Свойство Anchor предназначено для закрепления краев вашего компонента к краям родительского элемента, при этом изменяя размер parent’a, расстояние между указанными краями остается константой (постоянным). С англ. языка Anchor — это якорь. Условно говоря, вы кидаете якорь от края дочернего контрола к краю родителя. У компонентов четыре стороны, поэтому может быть максимум 4 якоря.
На словах может не сразу понятно что к чему, поэтому проиллюстрирую то, о чем только что написал:
Я кинул на форму ComboBox. По умолчанию его Anchor = Top, Left. Т.е. расстояние от его левого и верхнего края до аналогичных краев формы всегда постоянно. На рисунке справа я потянул за правую границу формы, а ComboBox так и остался в левом верхнем углу.
Допустим, если бы вы задали Anchor = Bottom, Right, то при изменении размеров формы комбобокс всегда был ближе к правому нижнему краю. По аналогии с комбинациями Top, Right и Bottom, Left. Поэкспериментируйте прямо в дизайнере Visual Studio, задавайте различные комбинации Anchor и растягивайте, сжимайте форму.
Если вам необходимо, чтобы контрол растягивался по ширине, задайте Left, Right. По высоте — Top, Bottom. Вот скриншот для первого случая:
В заключении данного кратенького обзора по позиционированию контролов Winforms языка программирования C#, хочу заметить, если вы меняете свойство Anchor, то Dock сбрасывается в значение по умолчанию (None). Аналогично, меняете Dock, проперти Anchor становится Left, Top (по умолчанию).