Panel.Dock Заповніть ігнорування інших параметрів Panel.Dock


154

Якщо ви створите панель на формі і встановите її на Dock = Top та випустіть іншу панель і встановите її Dock = Fill, вона може заповнити всю форму, ігноруючи першу панель. Зміна порядку вкладки нічого не робить.

Відповіді:


335

Розміщення стикування залежить від порядку управління елементами. Елементи керування стикуються "кнопкою вгору", тому перший елемент колекції стикується першим . Докований елемент керування враховує лише макет попередньо стикованих побратимів. Отже, керування за допомогою Dock = Fill має бути першим (вгорі) у порядку побратимів, якщо ви хочете, щоб він врахував інші стиковані елементи керування. Якщо це не перший елемент управління, попередні елементи керування будуть перекривати його.

Це може бути заплутаним, оскільки порядок братів та сестер не обов'язково такий же, як візуальний порядок, а порядок братів і сестер не завжди видно з дизайнерського погляду.

Структура документа (Перегляд -> Інші Windows -> Контур документа) дає корисний вид дерева на ієрархію та порядок управління, а також дозволяє змінювати порядок обміну елементами управління.

Ви також можете змінити порядок братів та сестер безпосередньо в дизайнері за контекстним меню -> Привести на фронт / Надіслати назад, який переміщує елемент управління першим або останнім з братів і сестер. Ці мітки меню можуть бути дещо заплутаними, оскільки фактичний ефект залежить від моделі компонування.

З фіксованими позиційними елементами управління 2D-положення не залежить від порядку побратимів, але коли елементи керування перекриваються, контроль, який найчастіше знаходиться в порядку, буде "зверху", приховуючи частину братів і сестер пізніше в порядку. У цьому контексті Доведення до фронту / Відправлення назад має сенс.

Всередині панелей компонування потоків або таблиць порядок створення визначає візуальний порядок елементів керування. Немає елементів перекриття. Тож привести на фронт / відправити назад дійсно означає зробити перший або останній у порядку управління.

При докованому макеті виведення на фронт / відправлення назад може бути ще більш заплутаним, оскільки він визначає, в якому порядку обчислюється док-станція, тому "принести на фронт" на керованому док-елементом елементі керування буде розміщено в середині батьківського елемента , беручи до уваги всі контрольно-стикові елементи управління.


1
у мене є панель, смужка статусу та смужка меню, все це у формі, і, здається, що коли я приєдную смужку меню доверху, смугу стану донизу та заповнюю панель, панель не заповнює простір між дві смужки, якщо це не перший брат (у верхній частині вікна Контур документа над двома смужками). Переміщення панелі вниз (у напрямку до "останнього") покриває поверх смуг. Тож чи повинен контрольний пристрій Dock = Fill бути першим братом у порядку? Я читаю це неправильно? я використовую 3.5 (2008). Це змінилося?
jrsconfitto

53
tl; dr; Клацніть правою кнопкою миші на панелі за допомогою Dock = Fill та натисніть «Bring to Front».
kristianp

20
+1 для вікна Контур документа Ніколи не знали, що це існує, але це так корисно.
gligoran

2
Як я можу це зробити програмно? Я маю на увазі, я додаю елементи керування динамічно, тому я не можу використовувати конструктор для цього.
Каміло Мартін

2
@Camilo: Якщо ви додаєте елементи управління динамічно, слід додати їх у потрібному порядку.
ЖакБ

110

Клацніть правою кнопкою миші на панелі за допомогою Dock = Fill та натисніть «Bring to Front».

Завдяки цьому цей елемент керування створюється останнім, що враховує настройки Dock для інших елементів керування в тому ж контейнері.


1
Просте, Godsend, це нас справді дратувало
всміхнений

Має сенс, коли ти думаєш про це.
Gary Kindel

7

Іншим, потенційно більш чистим варіантом є використання керування TableLayout. Встановіть один ряд потрібної висоти для верхньої доки, а інший рядок, щоб заповнити 100% для нижнього. Встановіть обидві панелі всередині на «Заливка», і ви закінчите.

(Таблиця TableLayout звичайно потребує звикання.)


1
Таблиця макетів також повільніше, ніж стикування контролерів для продуктивності компонування, особливо якщо ви вклали користувальницькі контролі, які використовують TableLayout. Однак, це справді дає гарне розташування.
Нік

1
Чи вражає ця ефективність те, що пересічний користувач побачив у простому випадку двох панелей, як описано вище? Або це щось, що вони помічають, коли у вас є десятки UC, всі з макетами, всі в одному макеті? (За іронією долі, додаток, над яким я зараз працюю, є таким, і продуктивність здається нормальною ...)
Джон Руді,

План-таблиця досить легка. Ви не побачите проблем із ефективністю, якщо ви просто викладете кілька елементів керування.
Тім

7

У мене була така ж проблема, і мені вдалося її вирішити.
Якщо у вас є контейнер з DockStyle.Fillіншими, ви також повинні мати DockStyle, але Top або все, що завгодно.
Важливим є додавання елемента керування DockStyle.Fillспочатку в Controls, а потім до інших.

Приклад:

ComboBox cb = new ComboBox();
cb.Dock =  DockStyle.Top;

GridView gv = new GridView();
gv.Dock =  DockStyle.Fill;

Controls.Add(gv); // this is okay
Controls.Add(cb);

але якщо ми поставимо cb першим

Controls.Add(cb);
Controls.Add(gv); // gv will overlap the combo box.

2

Якщо ви не хочете змінювати порядок елементів всередині коду, ви можете скористатися методом Container.Controls.SetChildIndex (), в якому Container є, наприклад, Form, Panel тощо, до якого ви хочете додати свої елементи управління.

Приклад:

     //Container ------------------------------------
     Panel Container = new Panel();

     //Top-Docked Element ---------------------------
     ButtonArea = new FlowLayoutPanel();
     Container.Controls.Add(ButtonArea);
     Container.Controls.SetChildIndex(ButtonArea, 1);
     ButtonArea.Dock = DockStyle.Top;

     //Fill-Docked Element --------------------------
     box = new RichTextBox();
     Container.Controls.Add(box);
     Container.Controls.SetChildIndex(box, 0); //setting this to 0 does the trick
     box.Dock = DockStyle.Fill;

1

ЖакБ мав ідею з документом, але ієрархія не вирішила моєї проблеми. Мої елементи керування не були в ієрархічному стилі, вони просто були перераховані з тим же батьків.

Я дізнався, що якщо ви змінили замовлення, він виправить так, як ви хочете, щоб він виглядав.

Елементи управління внизу списку будуть перекривати елементи керування вгорі у вікні Контур документа. У вашому випадку ви переконаєтесь, що перша панель знаходиться нижче другої панелі тощо.


0

Ось трюк, який спрацював для мене ..

Помістіть верхній предмет і з'єднайте його зверху.

Розмістіть спліттер, а також підключіть його до верху, а потім встановіть його відключеним (якщо ви не хочете змінити розмір верху).

Потім помістіть об'єкт Fill і встановіть Док-станція на Заповнення. Об'єкт залишиться нижче розгалужувача.


0

Я зіткнувся з тим же питанням. Під час виконання програми було додано нові / спеціальні елементи керування під смужкою меню. Проблема полягала в тому, що елементи керування, коли їх стикують, вирішили стикувати з верху форми і повністю ігнорувати смужку меню, дуже дратуючи, якщо ви запитаєте мене. Оскільки це доводилося робити динамічно з кодом, а не під час проектування, це стало дуже неприємним. Найпростіший спосіб, який я знайшов, - це створити панель під час режиму проектування та стикувати під смужкою меню. Звідти ви можете просто додати / видалити елементи керування на панель, і ви можете докинути їх під час виконання. Не потрібно возитися зі всіма елементами управління вашою формою, які насправді не потрібно змінювати, занадто багато роботи залежно від того, що вам дійсно потрібно зробити.

object.dock = Fill
Panel.Controls.Add(object)

0

Я знаю, що це старий пост, але я виявив щось корисне. Для програмного налаштування порядку керування братами та сестрами для динамічно створених елементів управління можна зробити щось на кшталт:

parentForm.Controls.SetChildIndex (myPanel, 0) 

У моєму випадку я зробив це, щоб перемістити панель Dock / Fill як перший елемент управління у моїй формі, щоб він не перетинався з іншим стикуваним керуванням, встановленим на Dock / Top (смужка меню).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.