按需将图像加载到 FlowLayoutPanel 中?
Load images on demand into FlowLayoutPanel?
我想用许多图像(约 400 张,500x500 像素)填充流布局面板。
我循环遍历包含文件名的字符串列表,并将此图片添加到 flp。
但超过 ~200 张图片面板不会显示更多图片。
我认为这是一个性能问题,我想问一下,是否可以加载图像"on demand"?
想滚动面板并只加载 "visible" 图像?
对于面板填充我使用这个:
public void PanelFill(List<string> filenames)
{
try
{
int temp = 0;
foreach (string filename in filenames)
{
GC.Collect();
PictureBox pic = new PictureBox
{
ClientSize = new Size(int_thumbWidth, int_thumbHeight),
//Image = new Bitmap(filename),
Tag = filename,
BorderStyle = BorderStyle.FixedSingle
};
if ((pic.Image.Width > int_thumbWidth) ||
(pic.Image.Height > int_thumbHeight))
{
pic.SizeMode = PictureBoxSizeMode.Zoom;
}
else
{
pic.SizeMode = PictureBoxSizeMode.CenterImage;
}
flowLayoutPanel_esww_bildvergleich.Invoke(new Action(() => { pic.Parent = flowLayoutPanel_esww_bildvergleich; }));
pic.Click += PictureBox_Click;
pic.DoubleClick += PictureBox_DoubleClick;
pic.MouseUp += PictureBox_MouseUp;
temp++;
}
}
catch (OutOfMemoryException)
{
MessageBox.Show("Es wurden zu viele Fotos gefunden. Der Arbeitsspeicher ist nicht ausreichend. Bitte passen Sie Ihre Filter an.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
str_aufnahmeTyp.Clear();
}
catch (Exception ex)
{
Fehlerbehandlung.Fehler(-1, ex.Message);
}
}
我的解决方法是添加一个 Scroll/MouseEnter- 事件处理程序来捕捉面板的滚动。
在处理程序中,我使用 .PerformLayout()
this.flowLayoutPanel_esww_bildvergleich.MouseEnter += new System.EventHandler(this.flowLayoutPanel_esww_bildvergleich_MouseEnter);
和...
private void flowLayoutPanel_esww_bildvergleich_MouseEnter(object sender, EventArgs e)
{
flowLayoutPanel_esww_bildvergleich.Focus();
flowLayoutPanel_esww_bildvergleich.PerformLayout();
}
我想用许多图像(约 400 张,500x500 像素)填充流布局面板。 我循环遍历包含文件名的字符串列表,并将此图片添加到 flp。 但超过 ~200 张图片面板不会显示更多图片。
我认为这是一个性能问题,我想问一下,是否可以加载图像"on demand"?
想滚动面板并只加载 "visible" 图像?
对于面板填充我使用这个:
public void PanelFill(List<string> filenames)
{
try
{
int temp = 0;
foreach (string filename in filenames)
{
GC.Collect();
PictureBox pic = new PictureBox
{
ClientSize = new Size(int_thumbWidth, int_thumbHeight),
//Image = new Bitmap(filename),
Tag = filename,
BorderStyle = BorderStyle.FixedSingle
};
if ((pic.Image.Width > int_thumbWidth) ||
(pic.Image.Height > int_thumbHeight))
{
pic.SizeMode = PictureBoxSizeMode.Zoom;
}
else
{
pic.SizeMode = PictureBoxSizeMode.CenterImage;
}
flowLayoutPanel_esww_bildvergleich.Invoke(new Action(() => { pic.Parent = flowLayoutPanel_esww_bildvergleich; }));
pic.Click += PictureBox_Click;
pic.DoubleClick += PictureBox_DoubleClick;
pic.MouseUp += PictureBox_MouseUp;
temp++;
}
}
catch (OutOfMemoryException)
{
MessageBox.Show("Es wurden zu viele Fotos gefunden. Der Arbeitsspeicher ist nicht ausreichend. Bitte passen Sie Ihre Filter an.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
str_aufnahmeTyp.Clear();
}
catch (Exception ex)
{
Fehlerbehandlung.Fehler(-1, ex.Message);
}
}
我的解决方法是添加一个 Scroll/MouseEnter- 事件处理程序来捕捉面板的滚动。 在处理程序中,我使用 .PerformLayout()
this.flowLayoutPanel_esww_bildvergleich.MouseEnter += new System.EventHandler(this.flowLayoutPanel_esww_bildvergleich_MouseEnter);
和...
private void flowLayoutPanel_esww_bildvergleich_MouseEnter(object sender, EventArgs e)
{
flowLayoutPanel_esww_bildvergleich.Focus();
flowLayoutPanel_esww_bildvergleich.PerformLayout();
}