2010-11-12 4 views
7

Это действительно ударяет меня по спине. У меня есть форма, созданная и принадлежащая основной форме приложения, которая используется для поиска записей. Форма выложена в прикрепленной таблице TableLayoutPanel с комбинацией строк/столбцов Absolute и Percentage, так что мои ярлыки остаются одинаковыми, а элементы ввода данных и контроля результатов растут. Мы говорим о 20 контролях, которые все сказали.Якорные элементы управления не изменяются при изменении размера окна (56k)

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

Я использовал свой Google-fu и нашел this SO question, который указал мне на this MSKB article. Я создал производную FlowLayoutPanel и производную таблицу TableLayoutPanel с потоковыми вызовами и поместил их, но он все еще не работает. Это единственная форма, на которой это происходит, а другая форма также имеет довольно глубокую вложенность (она использует TabControl и TableLayoutPanel для компоновки элементов управления вводом данных, но без RB).

Другой уместна информация:

  • Там нет свойств MaxSize набора.
  • Ничего не закреплено в этой форме, за исключением по умолчанию Top-Left; почти все заполнено док-станцией к контейнеру. Тем не менее, дочерний пользовательский элемент управления, содержащий таблицу результатов поиска, излагается внутренне с использованием привязки; это не было проблемой в другой форме, в которой я использую эти элементы управления, где я заполнял их до SplitPanels (вложенные две глубины, не менее).
  • RadioButtons и Labels имеют значение AutoSize, но ничего больше. По-видимому, это поведение по умолчанию для этих элементов управления, даже несмотря на то, что значения выделены жирным шрифтом в конструкторе и соответствует настройке других окон, размер которых изменяется правильно.
  • События изменения размера снимаются для формы, но не TLP.
  • Поведение не меняется, когда TLP привязана к окну INSTEAD от стыковки (это никогда не происходит одновременно).

Я отрываю свои волосы отсюда. Помогите!

Edit: Вот некоторые из запрошенных картинки, показывающие поведение макета в конструкторе и в приложении:

alt text alt text alt text alt text

Элементы управления, которые начинаются с «вложенной» производными непосредственно из встроенных элементов управления панелью, и их единственным изменением является переопределение OnSizeChanged() для асинхронного вызова базового метода (обходной путь из статьи KB). Как я уже говорил, он не работает со встроенными панелями. Как вы можете видеть из последних двух окон, mainLayout TLP просто не растет, даже если он пристыкован к окну в дизайнере.

+0

У вас есть изображение или изображение «контур документа» – Hath

+0

@Hath: Что вы имеете в виду, «вид в плане документа»? Я принесу вам печатные экраны формы в Design View и в приложении. – KeithS

+0

В режиме просмотра, вид-> Другие окна-> Структура документа (Ctrl + W, U) – Hath

ответ

6

Epic Facepalm.

В конструкторе этой формы (код пользователя) я позвонил SuspendLayout(), чтобы выполнить некоторые дополнительные настройки, которые могут повлиять на макет. Угадайте, что я НЕ звонил, когда закончил.

Если вы звоните SuspendLayout сделать свои собственные изменения пользовательского макета, всегда обязательно позвонить ResumeLayout(true) (или ResumeLayout(false) с последующим PerformLayout()), когда вы сделали.

+0

LOL Никогда не сработает ... Рад, что у вас это работает –

4

Являются ли элементы управления привязаны (свойство Anchor) или они состыкованы? Я обнаружил, что установка одной отключает другую. Я бы посмотрел в файле .Designer.cs и посмотрел, установлены ли как свойства док-станции, так и якоря, и, возможно, даже удалите свойства из исходного кода (конечно, резервное копирование).

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

+0

См. Мое редактирование: все элементы управления, созданные для этой страницы, состыкованы, однако дочерние элементы управления UserControl, используемые в форме, привязаны. Смешение их таким образом не было проблемой в основной форме. – KeithS

+0

@KeithS: Хорошо, я имел в виду, что элемент управления _same_, имеющий как привязку, так и набор свойств док-станции, обычно не работает. Можете ли вы что-то сделать, чтобы определить, какой элемент управления не изменяется? Например, установив цвет фона в контейнере или что-то подобное, которое сообщит вам во время выполнения, размер контейнера которого изменяется, а какой нет? –

+0

@gmagna: Я получаю ya; нет, ни один из элементов управления не имеет как док-станции, так и свойства привязки. Я отправлю printscreens после того, как я их обработаю (не могу показать всему миру результаты поиска), и я попробую трюк фонового цвета. – KeithS

1

У меня были проблемы с usercontrols, которые не выполняли то, что я ожидаю, так, как вы описываете, что это может быть связано с свойством usercontrol autoscalemode, установленным в «font» -Try. Изменение его наследования.

+0

Если бы я сказал вам, что в экземпляре пользовательского элемента не было параметра AutoScaleMode, вы бы сказали, что это проблема? – KeithS

0

Не закрепляйте и не закрепляйте отдельные элементы управления внутри TableLayoutPanel. Это редко делает то, что вы хотите.

+0

Не устанавливайте DockStyle = Заполните их. – Joshua

+0

Больше информации; я хочу, чтобы элементы управления занимали столько места, сколько они заданы ячейкой (-ами) в TLP, и чтобы они растягивались и сжимались с помощью формы. Это означает, что я либо закрепляю их, привязываю, либо откатываю собственную логику изменения размера в обработчике события Resize формы. Заполнение заполненного приложением TLP заполненными док-станциями элементов управления и использование TLP для управления тем, какие элементы управления могут растягиваться/сжиматься и как отлично работать в другой форме, которую я создал для того же приложения; почему он не должен здесь работать? – KeithS

+0

Я нашел самый эффективный способ потерять TableLayoutPanel, создать все элементы управления непосредственно в форме и использовать Anchors, чтобы определить, как вести себя, когда пользователь растягивает форму. – Joshua

1

Попробуйте установить Dock = DockStyle.Fill на контейнер TableLayoutPanel.

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