ОК, так что я ошибся, WinForms умнее, чем я думал.Вот тест, который вы можете сделать.Я не совсем уверен, что вы пытаетесь сделать, но это должно вам помочь.Для начала мы собираемся создать небольшое приложение WinForms.За одним исключением, мы не собираемся устанавливать какие-либо свойства элементов управления, которые мы перетаскиваем на экран:
- Создание нового приложения WinForms
- В конструкторе перетащите панель (который будет называться
panel1
) в форме - . На панели свойств установите
BorderStyle
на FixedSingle (это единственное свойство, которое мы собираемся установить) - Сделайте две копииэта панель (
panel2
и panel3
).Расположите их так, чтобы панели вообще не перекрывались. - На каждую панель добавьте несколько элементов управления (я поместил надписи (метки 1-3) и текстовые поля (также 1-3)) на каждую
- Рядом с каждой панелью (расположенной так, чтобы не было перекрытия) перетаскивайте три кнопки на форме (кнопки 1-3), чтобы визуально каждая кнопка ассоциировалась с аналогично пронумерованной панелью
- Дублировать
panel3
, включая содержащиеся в нем элементы управления (так что вы получаете panel4
, label4
и textbox4
).Расположите дубликат так, чтобы он значительно перекрывал панель 3
Теперь мы рассмотрим код, который дизайнер создает для вашей формы.Не связывайтесь с этим кодом (вы можете, но если вы не знаете, что делаете, он может оказаться плохим - и мы сохраняем это простым).
- ВВ обозревателе решений щелкните незаполненный треугольник слева от Form1.cs .Обратите внимание, что он вращается и становится твердым.Также обратите внимание, что Form1.Designer.cs отображается.Это обычно скрытый исходный файл, который содержит весь созданный дизайнером код, который соответствует форме и элементам управления, которые вы на нее уронили.
- Открыть Form1.Designer.cs
- Нажмите маленький серый значок плюса рядом с
Windows Form Designer generated code
- Проверьте файл.Обратите внимание, что каждое действие, выполненное в конструкторе, имеет соответствующую строку кода в файле Designer.cs (более или менее)
- Посмотрите код для одной из панелей (скажем,
panel1
).
Обратите внимание, что оно включает:
this.panel1.Controls.Add(this.textBox1);
this.panel1.Controls.Add(this.label1);
Прокрутите весь код до кода
Form1
и убедитесь, что панели и кнопки добавлены в коллекцию элементов управления формы:
Как:
this.Controls.Add(this.button3);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.panel4);
this.Controls.Add(this.panel3);
this.Controls.Add(this.panel2);
this.Controls.Add(this.panel1);
Примечаниечто заказ обратный.Порядок важен, он устанавливает Z-порядок (т. Е. Что и что перекрывает) для формы и элементов управления в форме.
Подключение кнопок
Выберите все три кнопки и нажмите <Enter>
.Это откроет файл Form1.cs и создаст три обработчика нажатия кнопки, которые вы можете заполнить.
Используйте этот код для трех обработчиков кнопки:
private void button1_Click(object sender, EventArgs e) {
var wasVisible = panel1.Visible;
panel1.Visible = !wasVisible;
}
private void button2_Click(object sender, EventArgs e) {
panel2.BringToFront();
}
private void button3_Click(object sender, EventArgs e) {
panel3.BringToFront();
}
Первая переключит видимость первой панели (я вставил дополнительную переменную, чтобы вы могли установить точку останова и посмотреть, что происходит).Второй выводит panel2
на передний план, изменяя его Z-порядок (он называется Z-порядок, потому что позиция на экране измеряется в X и Y, где позиция перекрытия связана с «глубиной» экрана,или Z-координата).Последний делает то же самое, чтобы panel3
.
Запустить программу.
- Когда вы нажимаете первую кнопку, первая панель и ее элементы управления исчезают (меня это удивило, WinForms умнее, чем я думал)
- Когда вы нажимаете вторую кнопку, ничего не появляетсяслучаться.Это потому, что единственное, что
panel2
пересекается, это форма, а panel2
уже покрывает форму, так что вы не видите никакого эффекта.(и потому что WinForms умнее, чем я думал) - Когда вы нажимаете третью кнопку,
panel2
(и его элементы управления) переходят в начало стека элементов управления, покрывая пересекающуюся часть panel4
.
Помогает ли это вам понять, как Visible
и BringToFront()
работают?