Стыковка и привязка к приложению Windows Form

Я разрабатываю приложение для Windows Mobile 5.0 и выше, используя C# и .NET Compact Framework 2.0 SP2.

У меня есть WinForm с двумя панелями внутри (upperPanel и bottomPanel). Я хочу, чтобы верхняя панель всегда заполняла 2/3 высоты формы, а нижняя панель заполняла 1/3 высоты формы. Обе панели будут полностью заполнять ширину формы.

Я использовал это:

upperPanel.Dock = Fill;
bottomPanel.Dock = Bottom;

Но upperPanel полностью заполняет форму.

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

Спасибо.


person VansFannel    schedule 04.11.2009    source источник


Ответы (8)


Что вам нужно сделать, так это сначала установить нижнюю панель и установить для ее свойства Dock значение Bottom. Затем установите высоту панели равной 1/3 высоты формы. Наконец, добавьте вторую панель и установите для ее свойства Dock значение Fill. Ключевым моментом здесь является то, что вы хотите добавить элемент управления, который заполнит оставшуюся область, которая будет добавлена ​​последней. Кроме того, вы можете поэкспериментировать с командами «На передний план» и «Отправить на задний план» в Visual Studio, чтобы заставить дизайнера сотрудничать.

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

person jasonh    schedule 04.11.2009
comment
Ключевым моментом здесь является то, что вы хотите добавить элемент управления, который заполнит оставшуюся область, которая будет добавлена ​​последней ‹-- это отлично работает для меня. Спасибо! - person Gant; 16.03.2010
comment
Как вы сказали, вместо того, чтобы добавлять в последнюю очередь, вы можете отстыковать, вывести на передний план, а затем снова пристыковать... хорошо! - person Dunc; 23.05.2013

Щелкните правой кнопкой мыши верхнюю панель и выберите «На передний план». Однако я не думаю, что это даст вам желаемый результат. При изменении размера нижняя панель останется той же высоты, а верхняя панель растянется, чтобы заполнить форму.

Используя ваши настройки стыковки, с этим кодом может помочь:

    protected override void OnSizeChanged(EventArgs e)
    {
        base.OnSizeChanged(e);

        this.bottomPanel.Height = Convert.ToInt32((double)this.Height / 3.0);
    }
person Philip Wallace    schedule 04.11.2009
comment
Результат, который я хочу, находится в моем решении. Попробуйте, прежде чем минусовать. - person VansFannel; 08.11.2009

Установите для обеих панелей значение «не закреплено». То есть: удалите Dock-Value и очистите свойство Anchor. Затем переместите элементы управления, чтобы они приобрели нужный размер.

После этого, при изменении размера формы, они должны измениться относительно.

ИЗМЕНИТЬ
К сожалению, только что попробовал и уверен, что это не работает. Я перепутал это с решением, которое автоматически удерживает элементы управления в центре окна...

Что ж, я полагаю, вам придется создать обработчик для события Resize формы и вручную выровнять элементы управления после изменения размера формы.

person Thorsten Dittmar    schedule 04.11.2009
comment
Хотя я вижу, что мой первый ответ был явно бесполезен, редактирование дает правильный намек на решение. Итак, всем тем, кто голосует против: пожалуйста, укажите причину в комментариях. - person Thorsten Dittmar; 05.11.2009
comment
Ваш ответ - это хороший ответ, но я искал решение без программного изменения размера. - person VansFannel; 06.11.2009

Перейдите в «Инструменты», «Другие окна», «Структура документа». Найдите две панели и поменяйте их местами. Элемент управления с DockStyle.Fill должен быть первым, чтобы он был правильно закреплен. (или последний.. никогда не уверен, какой именно, но это один из них :p)

Это не решит проблему всегда 1/3 и 2/3... потому что нижняя панель будет иметь фиксированную высоту (если я не ошибаюсь). Я думаю, что, возможно, TableLayoutPanel поддерживает это...

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

person Svish    schedule 04.11.2009
comment
Обидно, но в Compact Framework нет TableLayoutPanel. - person Thorsten Dittmar; 04.11.2009
comment
Кстати, вы правы в том, что нижняя панель имеет фиксированную высоту. - person Thorsten Dittmar; 04.11.2009
comment
Ах хорошо. Ну, я никогда не использовал Compact Framework, только обычные WinForms. - person Svish; 04.11.2009

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

Если вы не беспокоитесь о потере точности и формы не будут сильно двигаться, вы можете избежать этого, используя относительно умную привязку. По сути, вам нужно будет выбрать «росток» (часть формы, которая становится больше, чем больше становится форма). В этом случае я бы, вероятно, привязал верхнюю часть к Top | Слева | Правая и нижняя часть в Верх | Слева | Право | Нижний. Это будет означать, что нижняя часть формы станет больше, если форма расширится. В большинстве случаев это приемлемо. Если это не так, используйте событие Resize и некоторый код.

person Quibblesome    schedule 30.11.2009

Самый простой способ сделать это – вложить панели. Просто установите панели для верха и низа и заполните. Затем используйте панели внутри этих панелей, чтобы сделать то же самое. Единственные проблемы, которые у меня были, - это изменение размера сетки данных, что в любом случае всегда неприятно. в этом случае вы должны использовать некоторый код для изменения размера элемента управления datagrid в событии изменения размера формы.

person Cole    schedule 05.05.2010

Я хотел бы добавить точку к ответу @jasonh.

Для панели, занимающей 2/3 формы, необходимо установить для свойства AutoScroll панели значение true.

Это позволит панели отображать прокрутку, когда размер элемента управления превышает видимость для пользователя, а также обеспечит видимость меньшей панели, которая составляет 1/3 высоты формы.

person Karthik    schedule 29.12.2011

Вы можете получить требуемый дизайн, используя вложенные панели вместе с несколькими настройками свойств привязки и стыковки. Выполните следующие шаги: 1) Добавьте форму и поместите на нее Panel1. Установите его свойство Dock как «Заполнить», а ResizeMode — как «Увеличить и уменьшить». 2) Добавьте вторую панель2 и установите для ее свойства Dock значение «Bottom», установите высоту и установите для свойства Anchor значение «Top, Left». 3) Добавьте третью панель и установите для ее свойства Dock значение «Нет», установите высоту и установите для свойства Anchor значение «Верх, низ, лево, право».

Сохраните и скомпилируйте. Теперь все панели сохранят свое относительное позиционирование при изменении размера.

person Ranjeet Kumar    schedule 23.01.2014