Якщо ви створите панель на формі і встановите її на Dock = Top та випустіть іншу панель і встановите її Dock = Fill, вона може заповнити всю форму, ігноруючи першу панель. Зміна порядку вкладки нічого не робить.
Якщо ви створите панель на формі і встановите її на Dock = Top та випустіть іншу панель і встановите її Dock = Fill, вона може заповнити всю форму, ігноруючи першу панель. Зміна порядку вкладки нічого не робить.
Відповіді:
Розміщення стикування залежить від порядку управління елементами. Елементи керування стикуються "кнопкою вгору", тому перший елемент колекції стикується першим . Докований елемент керування враховує лише макет попередньо стикованих побратимів. Отже, керування за допомогою Dock = Fill має бути першим (вгорі) у порядку побратимів, якщо ви хочете, щоб він врахував інші стиковані елементи керування. Якщо це не перший елемент управління, попередні елементи керування будуть перекривати його.
Це може бути заплутаним, оскільки порядок братів та сестер не обов'язково такий же, як візуальний порядок, а порядок братів і сестер не завжди видно з дизайнерського погляду.
Структура документа (Перегляд -> Інші Windows -> Контур документа) дає корисний вид дерева на ієрархію та порядок управління, а також дозволяє змінювати порядок обміну елементами управління.
Ви також можете змінити порядок братів та сестер безпосередньо в дизайнері за контекстним меню -> Привести на фронт / Надіслати назад, який переміщує елемент управління першим або останнім з братів і сестер. Ці мітки меню можуть бути дещо заплутаними, оскільки фактичний ефект залежить від моделі компонування.
З фіксованими позиційними елементами управління 2D-положення не залежить від порядку побратимів, але коли елементи керування перекриваються, контроль, який найчастіше знаходиться в порядку, буде "зверху", приховуючи частину братів і сестер пізніше в порядку. У цьому контексті Доведення до фронту / Відправлення назад має сенс.
Всередині панелей компонування потоків або таблиць порядок створення визначає візуальний порядок елементів керування. Немає елементів перекриття. Тож привести на фронт / відправити назад дійсно означає зробити перший або останній у порядку управління.
При докованому макеті виведення на фронт / відправлення назад може бути ще більш заплутаним, оскільки він визначає, в якому порядку обчислюється док-станція, тому "принести на фронт" на керованому док-елементом елементі керування буде розміщено в середині батьківського елемента , беручи до уваги всі контрольно-стикові елементи управління.
Клацніть правою кнопкою миші на панелі за допомогою Dock = Fill та натисніть «Bring to Front».
Завдяки цьому цей елемент керування створюється останнім, що враховує настройки Dock для інших елементів керування в тому ж контейнері.
Іншим, потенційно більш чистим варіантом є використання керування TableLayout. Встановіть один ряд потрібної висоти для верхньої доки, а інший рядок, щоб заповнити 100% для нижнього. Встановіть обидві панелі всередині на «Заливка», і ви закінчите.
(Таблиця TableLayout звичайно потребує звикання.)
У мене була така ж проблема, і мені вдалося її вирішити.
Якщо у вас є контейнер з 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.
Якщо ви не хочете змінювати порядок елементів всередині коду, ви можете скористатися методом 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;
ЖакБ мав ідею з документом, але ієрархія не вирішила моєї проблеми. Мої елементи керування не були в ієрархічному стилі, вони просто були перераховані з тим же батьків.
Я дізнався, що якщо ви змінили замовлення, він виправить так, як ви хочете, щоб він виглядав.
Елементи управління внизу списку будуть перекривати елементи керування вгорі у вікні Контур документа. У вашому випадку ви переконаєтесь, що перша панель знаходиться нижче другої панелі тощо.
Ось трюк, який спрацював для мене ..
Помістіть верхній предмет і з'єднайте його зверху.
Розмістіть спліттер, а також підключіть його до верху, а потім встановіть його відключеним (якщо ви не хочете змінити розмір верху).
Потім помістіть об'єкт Fill і встановіть Док-станція на Заповнення. Об'єкт залишиться нижче розгалужувача.
Я зіткнувся з тим же питанням. Під час виконання програми було додано нові / спеціальні елементи керування під смужкою меню. Проблема полягала в тому, що елементи керування, коли їх стикують, вирішили стикувати з верху форми і повністю ігнорувати смужку меню, дуже дратуючи, якщо ви запитаєте мене. Оскільки це доводилося робити динамічно з кодом, а не під час проектування, це стало дуже неприємним. Найпростіший спосіб, який я знайшов, - це створити панель під час режиму проектування та стикувати під смужкою меню. Звідти ви можете просто додати / видалити елементи керування на панель, і ви можете докинути їх під час виконання. Не потрібно возитися зі всіма елементами управління вашою формою, які насправді не потрібно змінювати, занадто багато роботи залежно від того, що вам дійсно потрібно зробити.
object.dock = Fill
Panel.Controls.Add(object)
Я знаю, що це старий пост, але я виявив щось корисне. Для програмного налаштування порядку керування братами та сестрами для динамічно створених елементів управління можна зробити щось на кшталт:
parentForm.Controls.SetChildIndex (myPanel, 0)
У моєму випадку я зробив це, щоб перемістити панель Dock / Fill як перший елемент управління у моїй формі, щоб він не перетинався з іншим стикуваним керуванням, встановленим на Dock / Top (смужка меню).