Изменение размера одного элемента управления в WinForms - PullRequest
12 голосов
/ 21 апреля 2009

Как мне создать пользовательский интерфейс в C # / WinForms, который содержит несколько различных типов элементов управления, так что только размер элемента управления ListView изменяется, если пользователь изменяет размер окна?

Ответы [ 5 ]

24 голосов
/ 21 апреля 2009

Существует два основных способа автоматического изменения размера элемента управления на основе изменений размера родительского контейнера (форма в вашем случае):

  1. Установите для свойства элемента управления Dock значение DockStyle.Fill.
  2. Установите для свойства «Якорь» значение «Вверх, внизу, влево, вправо»

Использование свойства Dock с Dock.Fill

Преимущество этого метода состоит в том, что он берет весь элемент управления и говорит ему всегда заполнять всю клиентскую область родительского контейнера (в вашем случае, клиентскую область формы). Это полезно, если вы хотите сделать что-то вроде заполнения формы с помощью ListControl или TreeView или чего-то подобного. Но это не так полезно, если вы хотите масштабировать один элемент управления при использовании других элементов управления (как вы указали, это ваша потребность). В этом случае вам необходимо установить для свойства Dock в других элементах управления значение DockStyle.Top или DockStyle.Bottom, чтобы они плавали над или под основным элементом управления изменением размера.

Это хлопотно, и это также ограничивает параметры макета других элементов управления. Вы можете решить эту проблему, установив два элемента управления Panel, один сверху и другой снизу формы. Эти панели останутся в фиксированных положениях, в то время как средняя область (с вашим элементом управления DockStyle.Fill) масштабируется с родительской формой. Затем вы можете поместить любые элементы управления в любой конфигурации макета в эти панели «верхний и нижний колонтитулы».

Этот вид составного формостроения с использованием закрепленных панелей невероятно мощный. Откровенно говоря, это было изменение игры в .NET, когда они представили это с .NET 1.0 WinForms.

Используйте свойство Anchor с "Top, Bottom, Left, Right"

Если все, что вы хотите сделать, - это иметь один элемент управления на шкале формы, в то время как другие остаются «прилипшими» к краям, используйте свойство Anchor. Для элементов управления, которые вы хотите оставить наверху, установите для свойства Anchor значение «Top, Left» (по умолчанию). Для элементов управления, которые вы хотите оставить внизу, установите для свойства Anchor значение «Bottom, Left». Для элементов управления, которые вы хотите увеличить по ширине с помощью формы / диалога (например, однострочного элемента управления текстовым полем), установите для свойства Anchor значение «Влево, вправо» (и установите значение «Вверх» или «Вниз» в зависимости от того, хотите ли вы, чтобы оно перемещалось как верх или изменяется нижняя часть диалога.

И если вы хотите, чтобы размер элемента управления изменялся во всех направлениях с помощью формы, установите для свойства Anchor значение «Вверху, слева, снизу, справа». Очень полезно для вещей типа «основной элемент управления», таких как доминирующий список, древовидная структура или многострочный текст.

Для того, что вам нужно, не связывайтесь с AutoSize или AutoSizeMode ... эти свойства управляют тем, как элемент управления изменяет размер в зависимости от его собственного содержимого, а не как его размер изменяется в зависимости от поведения его контейнера. Думайте о режиме AutoSize / AutoSize как о внутреннем взгляде, в то время как Anchor / Dock смотрят наружу. Вы получаете очень странное поведение, если используете оба метода определения размера одновременно. Как правило, не полезно.

6 голосов
/ 21 апреля 2009

Прикрепите ListView ко всем четырем сторонам формы, а остальные элементы управления к 2 или менее.

3 голосов
/ 21 апреля 2009

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

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

Короче говоря: именно то, что сказал Джеймс, за исключением того, что это свойство "Якорь", а не "Док". Док похож, но не совсем такой.

1 голос
/ 29 августа 2010

Что если у нас есть несколько элементов управления в форме?

Например, : если форма используется для генерирования какого-либо результата в сетке относительно данных, введенных в паре текстовых полей или комбинированных полей и т. Д .; И мы хотим, чтобы они соответственно изменяли размеры / перестраивали и не перекрывали друг друга (, как это происходит при использовании dock-fill ), особенно с представлением сетки или подобным элементом управления в контексте. alt text

1 голос
/ 21 апреля 2009

Если вы поместите ListView в одну панель SplitContainer и поместите остальные элементы управления в другую панель, вы можете ограничить рост второй панели, установив min и maxsize.

Если ваш ListView пристыкован к Full, тогда при изменении размера формы потребуется все увеличение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...