Система вкладок с использованием панелей - PullRequest
0 голосов
/ 23 сентября 2019

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

private void SettingsButton_Click(object sender, EventArgs e)
{
    SettingsPanel.Visible = true;
    SettingsPanel.BringToFront();
}

Проблема заключается в том, что после нажатия кнопкинесколько кнопок, он будет отображать неправильную панель или вообще не отображать.Есть ли способ исправить это?

РЕДАКТИРОВАТЬ: Прежде чем вы спросите, я использую WinForms.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

То, что вы описываете, похоже на альтернативу TabControl.Вот пример:

Tabs alternative

Вы можете управлять текущей панелью, просто сделав ее видимой и закрепленной для заполнения.Скройте другие панели.

public partial class FormTabsAlternative
    : Form
{
    int         m_current = 0;
    List<Panel> m_tabs    = new List<Panel>();

    public FormTabsAlternative()
    {
        InitializeComponent();

        AddTab(pnl1);
        AddTab(pnl2);
        AddTab(pnl3);
        AddTab(pnl4);

        SetUpTabsAndButtons();
    }

    private void AddTab(Panel pnl)
    {
        m_tabs.Add(pnl);

        pnl.Dock = DockStyle.Fill;
    }

    private void OnLeftClick(object sender, EventArgs e)
    {
        if (m_current > 0)
        {
            m_current--;

            SetUpTabsAndButtons();
        }
    }

    private void OnRightClick(object sender, EventArgs e)
    {
        if (m_current < m_tabs.Count - 1)
        {
            m_current++;

            SetUpTabsAndButtons();
        }
    }

    private void SetUpTabsAndButtons()
    {
        for (int index = 0; index < m_tabs.Count; index++)
        {
            var panel     = m_tabs[index];

            panel.Visible = index == m_current;
        }

        btnLeft .Enabled = m_current > 0;
        btnRight.Enabled = m_current < m_tabs.Count - 1;
    }
}
0 голосов
/ 23 сентября 2019

ОК, так что я ошибся, WinForms умнее, чем я думал.Вот тест, который вы можете сделать.Я не совсем уверен, что вы пытаетесь сделать, но это должно вам помочь.Для начала мы собираемся создать небольшое приложение WinForms.За одним исключением, мы не собираемся устанавливать какие-либо свойства элементов управления, которые мы перетаскиваем на экран:

  1. Создание нового приложения WinForms
  2. В конструкторе перетащите панель (который будет называться panel1) в форме
  3. . На панели свойств установите BorderStyle на FixedSingle (это единственное свойство, которое мы собираемся установить)
  4. Сделайте две копииэта панель (panel2 и panel3).Расположите их так, чтобы панели вообще не перекрывались.
  5. На каждую панель добавьте несколько элементов управления (я поместил надписи (метки 1-3) и текстовые поля (также 1-3)) на каждую
  6. Рядом с каждой панелью (расположенной так, чтобы не было перекрытия) перетаскивайте три кнопки на форме (кнопки 1-3), чтобы визуально каждая кнопка ассоциировалась с аналогично пронумерованной панелью
  7. Дублировать panel3, включая содержащиеся в нем элементы управления (так что вы получаете panel4, label4 и textbox4).Расположите дубликат так, чтобы он значительно перекрывал панель 3

Теперь мы рассмотрим код, который дизайнер создает для вашей формы.Не связывайтесь с этим кодом (вы можете, но если вы не знаете, что делаете, он может оказаться плохим - и мы сохраняем это простым).

  1. ВВ обозревателе решений щелкните незаполненный треугольник слева от Form1.cs .Обратите внимание, что он вращается и становится твердым.Также обратите внимание, что Form1.Designer.cs отображается.Это обычно скрытый исходный файл, который содержит весь созданный дизайнером код, который соответствует форме и элементам управления, которые вы на нее уронили.
  2. Открыть Form1.Designer.cs
  3. Нажмите маленький серый значок плюса рядом с Windows Form Designer generated code
  4. Проверьте файл.Обратите внимание, что каждое действие, выполненное в конструкторе, имеет соответствующую строку кода в файле Designer.cs (более или менее)
  5. Посмотрите код для одной из панелей (скажем, 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() работают?

...