C# Winform расстояние между панелями при изменении ширины\высоты
у меня тут возникла проблема с динамически созданными панелями, когда я меняю размер формы своей, N-ое кол-во панелей меняют свою ширину тоже, и при необходимости (зависит от текста внутри панели), меняют свою высоту.. ну и потом когда ширина формы делается больше - панели по высоте\ширине становятся обратно нормальными... НО когда высота у панелей изменяется - нужно чтоб расстояние оставалось неизменным... пробовал разные методы уже, но все получается криво... подскажите плиз.
Код:
public void checkResize(string msg_out, object panel_sender, object text_msg_sender, int panHei, int numbs)
{
Panel pan_item = (Panel)panel_sender;
Label lab_item = (Label)text_msg_sender;
char[] msg_arr = msg_out.ToCharArray();
int panWidthRaznost = 308 - pan_item.Width;
int panWidth = pan_item.Width;
if (int.Parse(pan_item.Name) != numbs - 1) //если это 1ая панель - не делать изменения локации для нее
{
if (panWidth < buff) //если панель сужается - делать расстояние между панелями больше
{
this.Controls.OfType<Panel>().OrderBy(x => Convert.ToInt32(x.Tag)).ToList().ForEach(pan => setPanelLocation(pan)); //попытка №1
/* if (panWidthRaznost % 15 == 0) //попытка №2
{
for (int i = int.Parse(pan_item.Name); i >= 0; i--)
{
panel1.Controls[i.ToString()].Location = new Point(panel1.Controls[i.ToString()].Location.X, panel1.Controls[i.ToString()].Location.Y + 1);
}
} */
}
if (panWidth > buff) //если панель растягивается - делать расстояние между панелями меньше
{
this.Controls.OfType<Panel>().OrderBy(x => Convert.ToInt32(x.Tag)).ToList().ForEach(pan => setPanelLocation(pan)); //попытка №1
/*if (panWidthRaznost % 15 == 0) //попытка №2
{
for (int i = int.Parse(pan_item.Name); i >= 0; i--)
{
panel1.Controls[i.ToString()].Location = new Point(panel1.Controls[i.ToString()].Location.X, panel1.Controls[i.ToString()].Location.Y - 1);
}
}*/
}
buffCountPan++;
if (buffCountPan == panel1.Controls.Count - 1)
{
buff = panWidth;
buffCountPan = 0;
}
}
if (msg_arr.Length > 26) //если кол-во символов в сообщении меньше - не менять размеры панели и лейбла
{
int panWidthRaznostForHeight = (308 - pan_item.Width) / 4; //разность на сколько уменьшили панель
pan_item.Height = panHei + panWidthRaznostForHeight; //разность на сколько нужно увеличить панель
lab_item.MaximumSize = new System.Drawing.Size(300 - panWidthRaznost, 100); //изменение ширины лейбла сообщения
lab_item.MinimumSize = new System.Drawing.Size(300 - panWidthRaznost, 14); //изменение ширины лейбла сообщения
}
}
private void setPanelLocation(Panel pnl)
{
int iPanelOrder = Convert.ToInt32(pnl.Tag);
if (iPanelOrder == 0)
{
pnl.Top = MinimumStartLocation;
}
else
{
pnl.Top = this.Controls.OfType<Panel>().ToList().Find(pan => Convert.ToInt32(pan.Tag) == iPanelOrder - 1).Bottom + DistanceBetweenPanel;
}
}
{
Panel pan_item = (Panel)panel_sender;
Label lab_item = (Label)text_msg_sender;
char[] msg_arr = msg_out.ToCharArray();
int panWidthRaznost = 308 - pan_item.Width;
int panWidth = pan_item.Width;
if (int.Parse(pan_item.Name) != numbs - 1) //если это 1ая панель - не делать изменения локации для нее
{
if (panWidth < buff) //если панель сужается - делать расстояние между панелями больше
{
this.Controls.OfType<Panel>().OrderBy(x => Convert.ToInt32(x.Tag)).ToList().ForEach(pan => setPanelLocation(pan)); //попытка №1
/* if (panWidthRaznost % 15 == 0) //попытка №2
{
for (int i = int.Parse(pan_item.Name); i >= 0; i--)
{
panel1.Controls[i.ToString()].Location = new Point(panel1.Controls[i.ToString()].Location.X, panel1.Controls[i.ToString()].Location.Y + 1);
}
} */
}
if (panWidth > buff) //если панель растягивается - делать расстояние между панелями меньше
{
this.Controls.OfType<Panel>().OrderBy(x => Convert.ToInt32(x.Tag)).ToList().ForEach(pan => setPanelLocation(pan)); //попытка №1
/*if (panWidthRaznost % 15 == 0) //попытка №2
{
for (int i = int.Parse(pan_item.Name); i >= 0; i--)
{
panel1.Controls[i.ToString()].Location = new Point(panel1.Controls[i.ToString()].Location.X, panel1.Controls[i.ToString()].Location.Y - 1);
}
}*/
}
buffCountPan++;
if (buffCountPan == panel1.Controls.Count - 1)
{
buff = panWidth;
buffCountPan = 0;
}
}
if (msg_arr.Length > 26) //если кол-во символов в сообщении меньше - не менять размеры панели и лейбла
{
int panWidthRaznostForHeight = (308 - pan_item.Width) / 4; //разность на сколько уменьшили панель
pan_item.Height = panHei + panWidthRaznostForHeight; //разность на сколько нужно увеличить панель
lab_item.MaximumSize = new System.Drawing.Size(300 - panWidthRaznost, 100); //изменение ширины лейбла сообщения
lab_item.MinimumSize = new System.Drawing.Size(300 - panWidthRaznost, 14); //изменение ширины лейбла сообщения
}
}
private void setPanelLocation(Panel pnl)
{
int iPanelOrder = Convert.ToInt32(pnl.Tag);
if (iPanelOrder == 0)
{
pnl.Top = MinimumStartLocation;
}
else
{
pnl.Top = this.Controls.OfType<Panel>().ToList().Find(pan => Convert.ToInt32(pan.Tag) == iPanelOrder - 1).Bottom + DistanceBetweenPanel;
}
}
так-же выложу для большего понятия кусок проекта...
Я чайник в шарпе, но что, там нет "якорей", "подпорок" и "пружин" для элементов интерфейса? Зачем вручную вычислять новые размеры и координаты?
вопрос исчерпан, но отвечу на твой вопрос, для якоря есть, и они используются для right \ left , а для top \ bottom делать для динамических панелей не желательно, т.к. єто динамические панели, они просто в кучу собьются... поэтому было сделано с помощью еще 1 панели для каждой панельки и присвоен стиль Dock=top.