Загружать изображения по запросу в FlowLayoutPanel? - PullRequest
0 голосов
/ 14 февраля 2020

Я хочу заполнить панель потока множеством изображений (~ 400p c., 500x500px). Я l oop через список строк с именами файлов и добавить эти фотографии в flp. Но выше ~ 200 изображений панель не показывает больше изображений.

Я думаю, что это проблема производительности, и я хочу спросить, можно ли загружать изображения «по требованию»?

Как прокрутка панели и загрузка только «видимого» изображения?

Для заполнения панели я использую это:

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);
    }
}

1 Ответ

0 голосов
/ 14 февраля 2020

Обходной путь для меня - добавить Scroll / MouseEnter - Eventhandler для перехвата прокрутки на панели. В обработчике я использую .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();
    }
...