Перекрывающийся стиль доков.Верхние Панели

#c# #.net #winforms

Вопрос:

Я пытаюсь добавлять новую панель с верхней частью в стиле док-станции на панель каждый раз при нажатии кнопки. Каждый раз, когда я нажимаю кнопку, панель создается и добавляется к родительской, но, несмотря на то, что dockstyle установлен на верхний, они всегда добавляются в одно и то же место. Я попытался настроить его с помощью BringToFront, но это ничего не изменило. Нужно ли мне применять какой-то макет к родительской панели, прежде чем я смогу использовать DockStyle?

Вот Мой Код:

 private void AddInputLine()
        {
            this.ButtonFileDialog.Add(this.CreateFileBrowserButton());
            this.TextBoxInput.Add(this.CreateInputTextBox());

            System.Drawing.Size buttonSize = new System.Drawing.Size(this.TextBoxInput[^1].Size.Height, this.TextBoxInput[^1].Size.Height);
            this.ButtonFileDialog[^1].MinimumSize = buttonSize;
            this.ButtonFileDialog[^1].MaximumSize = buttonSize;

            this.FormatPanels.Add(new Panel());

            this.FormatPanels[^1].Controls.Add(this.TextBoxInput[^1]);
            this.TextBoxInput[^1].BringToFront();

            this.FormatPanels[^1].Controls.Add(this.ButtonFileDialog[^1]);
            this.ButtonFileDialog[^1].BringToFront();

            this.PanelRightSide.Controls.Add(this.FormatPanels[^1]);
            this.FormatPanels[^1].Dock = DockStyle.Top;
        }
 

Комментарии:

1. Я бы посоветовал вам поиграть с дизайнером форм, вручную перетаскивая панели и устанавливая их свойства. Затем перейдите в файл Form1.designer.cs, скопируйте оттуда сгенерированный код и используйте этот код для динамического заполнения панелей. ps Что с ^1 этим ?

2. Спасибо, думаю, мне придется пойти этим путем… ^1 означает, что индекс считывается в обратном порядке, поэтому он получает последний элемент списка.

3. Вместо того, чтобы злоупотреблять индексатором, работайте с реальными экземплярами только что созданных объектов, а затем проверьте, что вы на самом деле выводите на передний план и что вы закрепляете: не один и тот же объект. — Функция BringToFront() / SendToBack() layout применяется к закрепленному элементу управления, а не к его дочерним элементам управления. — Я предлагаю использовать панель FlowLayoutPanel или панель TableLayoutPanel для упрощения / автоматизации такого рода компоновки.

4. Последний, который вы добавляете, идет сверху. Так что вы, вероятно, имели это в виду. ФорматПанели[^1].Приведите функцию (), чтобы добавить ее. Да, это становится более читабельным, когда вы используете переменную для хранения ссылки на панель.

Ответ №1:

Хорошо, я нашел проблему… Свойство AutoScroll родителя было ложным. Вновь созданные панели просто заполнили весь родительский элемент, так что остальные просто не были видны. После активации автоматической прокрутки и автоматического размера это сработало. Это рабочая версия панели форматирования:

 this.FormatPanels.Add(new Panel
            {
                BackColor = System.Drawing.Color.FromArgb((int)Ressources.AppColors.MenuBackground),
                Padding = new Padding(3),
                Dock = DockStyle.Top,
                AutoSize = true,
                AutoSizeMode = AutoSizeMode.GrowAndShrink,
                MinimumSize = new System.Drawing.Size(70, 60),
            });
 

Комментарии:

1. Вы можете принять свой собственный ответ, как только сочтете его достаточно полным (возможно, вам следует добавить пример кода). Это поможет другим людям, сталкивающимся с той же проблемой.

2. Пожалуйста, добавьте дополнительные сведения, чтобы расширить свой ответ, например, ссылки на рабочий код или документацию.