На одной из вкладок TabControl
а есть панель. У панели включены Anchor
ы. По-этому, всё ресайзится автоматически. В этой панели нужно застекать массив моих любимых UserControl
ов.
//
// tabPageStreams
//
this.tabPageStreams.Controls.Add(this.panelStreams);
this.tabPageStreams.Controls.Add(this.scrollBarStreams);
this.tabPageStreams.Location = new System.Drawing.Point(4, 22);
this.tabPageStreams.Name = "tabPageStreams";
this.tabPageStreams.Padding = new System.Windows.Forms.Padding(3);
this.tabPageStreams.Size = new System.Drawing.Size(818, 482);
this.tabPageStreams.TabIndex = 4;
this.tabPageStreams.Text = "Стримы";
this.tabPageStreams.UseVisualStyleBackColor = true;
//
// panelStreams
//
this.panelStreams.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.panelStreams.BackColor = System.Drawing.Color.Black;
this.panelStreams.Location = new System.Drawing.Point(0, 0);
this.panelStreams.Name = "panelStreams";
this.panelStreams.Size = new System.Drawing.Size(795, 482);
this.panelStreams.TabIndex = 2;
//
// scrollBarStreams
//
this.scrollBarStreams.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Right)));
this.scrollBarStreams.Location = new System.Drawing.Point(798, 0);
this.scrollBarStreams.Name = "scrollBarStreams";
this.scrollBarStreams.Size = new System.Drawing.Size(17, 482);
this.scrollBarStreams.TabIndex = 1;
this.scrollBarStreams.Scroll += new System.Windows.Forms.ScrollEventHandler(this.scrollBarStreams_Scroll);
private void Form1_Resize(object sender, EventArgs e)
{
if (tabControlMain.SelectedTab == tabPageStreams)
{
StackFramesStream();
}
else if (tabControlMain.SelectedTab == tabPageDownload)
{
StackFramesDownload();
}
}
private void tabControlMain_Selected(object sender, TabControlEventArgs e)
{
if (e.TabPage == tabPageStreams)
{
StackFramesStream();
}
else if (e.TabPage == tabPageDownload)
{
StackFramesDownload();
}
}
private int StackFramesStream()
{
if (framesStream.Count > 0)
{
int w = framesStream[0].Width;
int h = framesStream[0].Height;
int gap = 4;
int rowsCount;
int perRow = panelStreams.Width / (w + gap);
if (perRow == 0)
{
perRow = 1;
}
if (framesStream.Count % perRow == 0)
{
rowsCount = framesStream.Count / perRow;
}
else
{
rowsCount = framesStream.Count / perRow + 1;
}
int xStart = ((panelStreams.Width - scrollBarStreams.Width) / 2) - ((w + gap) * perRow / 2);
int x = xStart;
int y = -h - gap;
for (int i = 0; i < framesStream.Count; i++)
{
if (i % perRow == 0)
{
y += h + gap;
x = xStart;
}
framesStream[i].Location = new Point(x, y - scrollBarStreams.Value);
x += w + gap;
}
int j = (h + gap) * rowsCount;
if (j > panelStreams.Height)
{
scrollBarStreams.Maximum = j;
scrollBarStreams.LargeChange = panelStreams.Height;
scrollBarStreams.SmallChange = 10;
scrollBarStreams.Enabled = true;
}
else
{
scrollBarStreams.Enabled = false;
}
return rowsCount;
}
else
{
scrollBarStreams.Enabled = false;
}
return 0;
}
Если ресайзить форму при активной вкладке, то всё нормально.
А если ресайзнуть окно при неактивной вкладке, а потом переключиться на нужную, то ширина панели определяется неправильно и стековка выглядит вот так:
если пощёлкать вкладки туда-сюда, то становится нормально.