#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. Пожалуйста, добавьте дополнительные сведения, чтобы расширить свой ответ, например, ссылки на рабочий код или документацию.