C #: привязанная панель не будет правильно изменять размер - PullRequest
20 голосов
/ 01 февраля 2010

У меня странная проблема с автоматическим изменением размеров панели в пользовательском элементе управления. Эта панель привязана ко всем 4 сторонам пользовательского элемента управления. Но привязка не всегда работает как надо:

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

Я не вижу разницы между изменением размера через сплиттер и через форму.

Установка размера вручную в OnResize UserControl работает только в том случае, если изменение размера выполняется путем перемещения сплиттера. Если изменение размера происходит при изменении размера формы, высота и ширина панели не изменятся на новые значения.

Редактировать: Чтобы сделать его более понятным: пользовательский элемент управления добавляется в TabPage и устанавливается на Dock = DockType.Fill.

Edit2: чтобы сделать его более сложным: это иерархия, в которой используется элемент управления: Форма содержит разделитель с двумя элементами управления (A и B). (B) содержит пользовательский элемент управления (C) с splitContainer. Разделенный контейнер-> панель 1 в (С) содержит элемент управления табуляции (D). Этот tabcontrol (D) содержит пользовательский элемент управления (E) (на вкладке). Этот пользовательский элемент управления (E) имеет разделительный контейнер (F), в который помещается другой элемент управления с tabControl (G). Этот tabcontrol (G) имеет вкладки, и на этих страницах находится описанный пользовательский элемент управления (H).

Если поместить элемент управления (H) непосредственно на панель в разъемном контейнере (C), все будет работать нормально. Поскольку для всех элементов управления, которые добавляются в splitcontainer или вкладку, задано значение docktype = fill, я не могу понять, почему последний элемент управления имеет такие проблемы.

Есть ли какие-либо ограничения в структуре Windows Forms, ограничивающие количество дочерних элементов управления?

Edit: я загрузил TestApplication, с помощью которого вы можете воспроизвести эту проблему. http://rapidshare.de/files/49092516/TestApplication.zip.html Это происходит только под Vista. Win XP и 7 работают нормально ... Если вы измените размер формы, textBox с кнопкой «...» не изменится, но если вы измените размер через вертикальный splitContainer, он будет работать.

Ответы [ 3 ]

36 голосов
/ 24 марта 2010

Существует ошибка с глубоким вложением, когда ядру не хватает места в стеке, из-за которого изменение размера, закрепление и привязка молча завершаются ошибкой.

См. https://web.archive.org/web/20140818095718/http://support.microsoft.com/kb/953934

2 голосов
/ 03 февраля 2010

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

Звучит так, как будто вы дважды проверили защиту элемента управления, но проверяли ли вы его: View-> Other Windows-> Document Outline (очень удобный инструмент, который я только недавно обнаружил)?

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

Удачи.

1 голос
/ 03 февраля 2010

Проблема не в глубине вложенности; элементы управления могут быть вложены сколь угодно глубоко. Закрепление и стыковка, как правило, не очень хорошо сочетаются друг с другом. Я обычно предпочитаю стыковку, а не привязку, но какое бы решение вы ни выбрали, вам, вероятно, следует избегать их смешивания.

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